<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Idei_de_subiecte_15-22_februarie_2013</id>
	<title>Idei de subiecte 15-22 februarie 2013 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=Idei_de_subiecte_15-22_februarie_2013"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Idei_de_subiecte_15-22_februarie_2013&amp;action=history"/>
	<updated>2026-04-15T12:06:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Idei_de_subiecte_15-22_februarie_2013&amp;diff=6261&amp;oldid=prev</id>
		<title>Cata at 15:39, 5 February 2013</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Idei_de_subiecte_15-22_februarie_2013&amp;diff=6261&amp;oldid=prev"/>
		<updated>2013-02-05T15:39:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Clasele IX-X =&lt;br /&gt;
&lt;br /&gt;
== Skip lists ==&lt;br /&gt;
&lt;br /&gt;
Avantaje:&lt;br /&gt;
&lt;br /&gt;
* le-ar prinde bine o structură de căutare&lt;br /&gt;
* e bine să-și exerseze mâna cu pointeri&lt;br /&gt;
&lt;br /&gt;
Idei de predare (bazate pe [ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf articolul original] și pe [[Note de curs, clasele 11-12, 18 ianuarie 2013|ce am făcut la XI/XII]]):&lt;br /&gt;
&lt;br /&gt;
=== Operații dorite ===&lt;br /&gt;
&lt;br /&gt;
* inserare / ștergere / căutare / minim / maxim / cea mai apropiată valoare&lt;br /&gt;
&lt;br /&gt;
=== Comparația cu alte structuri posibile ===&lt;br /&gt;
&lt;br /&gt;
* arbori de căutare: oferă timpi logaritmici, dar echilibrarea este greoaie&lt;br /&gt;
* tabele hash: nu suportă ordonare&lt;br /&gt;
* listă: timpi de acces liniari&lt;br /&gt;
&lt;br /&gt;
=== Noțiuni de probabilități ===&lt;br /&gt;
 &lt;br /&gt;
Avem nevoie de 3 valori așteptate. Cred că trebuie predate la clasele mici.&lt;br /&gt;
&lt;br /&gt;
* experiment Bernoulli (valoarea 1 cu probabilitate &amp;#039;&amp;#039;p&amp;#039;&amp;#039;, 0 cu probabilitate &amp;#039;&amp;#039;q&amp;#039;&amp;#039; = 1 - &amp;#039;&amp;#039;p&amp;#039;&amp;#039;)&lt;br /&gt;
* exemple: zar, monedă măsluită&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;valoarea așteptată pt. Bernoulli:&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt;1 \cdot p + 0 \cdot q = p&amp;lt;/math&amp;gt;&lt;br /&gt;
* experiment binomial B(&amp;#039;&amp;#039;n&amp;#039;&amp;#039;, &amp;#039;&amp;#039;p&amp;#039;&amp;#039;) = o serie de &amp;#039;&amp;#039;n&amp;#039;&amp;#039; experimente Bernoulli&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;valoarea așteptată pt. binomial:&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt;n \cdot p&amp;lt;/math&amp;gt; (cele &amp;#039;&amp;#039;n&amp;#039;&amp;#039; experimente sunt independente, deci se pot aduna)&lt;br /&gt;
* numărul de experimente până la succes: distribuție geometrică&lt;br /&gt;
* exemplu: dau cu zarul până dau 1; fie evenimentul X = „numărul de aruncări până dau 1”&lt;br /&gt;
* atunci &amp;lt;math&amp;gt;P(X = 1) = \frac{1}{6}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;P(X = 2) = \frac{5}{6} \cdot \frac{1}{6}&amp;lt;/math&amp;gt;, ..., &amp;lt;math&amp;gt;P(X = k) = \left ( \frac{5}{6} \right ) ^{k - 1} \cdot \frac{1}{6}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;valoarea așteptată a distribuției binomiale:&amp;#039;&amp;#039;&amp;#039; &amp;lt;math&amp;gt;E(X) = \sum_{k=1}^\infty k * P(X = k) = \sum_{k=1}^\infty k q^{k-1} p = \frac{1}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
** se demonstrează așezând termenii într-un triunghi și însumând fiecare coloană, apoi însumând sumele.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
p &amp;amp; + \\&lt;br /&gt;
q p &amp;amp; + &amp;amp; q p &amp;amp; + \\&lt;br /&gt;
q^{2} p &amp;amp; + &amp;amp; q^{2} p &amp;amp; + &amp;amp; q^{2} p &amp;amp; + \\&lt;br /&gt;
q^{3} p &amp;amp; + &amp;amp; q^{3} p &amp;amp; + &amp;amp; q^{3} p &amp;amp; + &amp;amp; q^{3} p &amp;amp; + \\&lt;br /&gt;
... &amp;amp; &amp;amp; ... &amp;amp; &amp;amp; ... &amp;amp; &amp;amp; ... &amp;amp; &amp;amp; ... \\&lt;br /&gt;
\hline&lt;br /&gt;
= 1 &amp;amp; + &amp;amp; q &amp;amp; + &amp;amp; q^{2} &amp;amp; + &amp;amp; q^{3} &amp;amp; + &amp;amp; ...  &amp;amp; = \frac{1}{1-q} = \frac{1}{p}&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Idee pentru o structură imutabilă (fără inserări / ștergeri) ===&lt;br /&gt;
&lt;br /&gt;
* listă cu toate elementele&lt;br /&gt;
* peste ea, o listă cu pointeri din 2 în 2 ⇒ e nevoie de &amp;#039;&amp;#039;n&amp;#039;&amp;#039;/2 + 1 comparații&lt;br /&gt;
* peste ele, o listă cu pointeri din 4 în 4 ⇒ e nevoie de &amp;#039;&amp;#039;n&amp;#039;&amp;#039;/4 + 2 comparații&lt;br /&gt;
* generalizare: &amp;lt;math&amp;gt;\log_{2} n&amp;lt;/math&amp;gt; liste&lt;br /&gt;
* timp de căutare logaritmic&lt;br /&gt;
* dar imposibil de întreținut la inserări / ștergeri&lt;br /&gt;
&lt;br /&gt;
=== Structură probabilistică ===&lt;br /&gt;
&lt;br /&gt;
* nivelul 0 conține toate elementele&lt;br /&gt;
* dacă un element apare la nivelul &amp;#039;&amp;#039;k&amp;#039;&amp;#039;, apare și la nivelul &amp;#039;&amp;#039;k&amp;#039;&amp;#039; + 1 cu probabilitatea &amp;#039;&amp;#039;p&amp;#039;&amp;#039;&lt;br /&gt;
* experiment binomial, deci nivelul 1 conține &amp;lt;math&amp;gt;p n&amp;lt;/math&amp;gt; elemente, nivelul 2 conține &amp;lt;math&amp;gt;p^{2} n&amp;lt;/math&amp;gt; elemente etc.&lt;br /&gt;
* &amp;#039;&amp;#039;p&amp;#039;&amp;#039; este 0,25 sau 0,5 în practică&lt;br /&gt;
* nivelul unui element este determinat la inserare și rămâne constant pe durata vieții elementului&lt;br /&gt;
* număr fixat de niveluri, circa &amp;lt;math&amp;gt;\log_{\frac{1}{p}} n&amp;lt;/math&amp;gt; pentru &amp;#039;&amp;#039;n&amp;#039;&amp;#039; elemente așteptate.&lt;br /&gt;
* pointeri de început pentru fiecare nivel; santinelă (valoare infinită) la sfârșit&lt;br /&gt;
* pseudocod pentru căutare (Pugh)&lt;br /&gt;
* analiză de complexitate. Cred că se poate mai intuitiv decât Pugh:&lt;br /&gt;
** mergem de la elementul căutat (nivel 0) în stânga și în sus&lt;br /&gt;
** câte elemente vom parcurge în stânga până găsim un element care urcă un nivel? Probabilistic, &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
** sunt &amp;lt;math&amp;gt;\log_{\frac{1}{p}} n&amp;lt;/math&amp;gt; niveluri&lt;br /&gt;
** deci timp total &amp;lt;math&amp;gt;O(\frac{1}{p} \cdot \log_{\frac{1}{p}} n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* pseudocod pentru inserare, ștergere (Pugh)&lt;br /&gt;
* pseudocod pentru alegerea aleatoare nivelului la inserare, conform distribuției geometrice (Pugh)&lt;br /&gt;
* atenție la factorii constanți la probleme subliniare&lt;br /&gt;
** &amp;lt;math&amp;gt;2 \log n&amp;lt;/math&amp;gt; în loc de &amp;lt;math&amp;gt;\log n&amp;lt;/math&amp;gt; înseamnă că primul algoritm procesează &amp;#039;&amp;#039;n&amp;#039;&amp;#039; valori, iar al doilea &amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structură deterministă (opțional / nu pentru concurs) ===&lt;br /&gt;
&lt;br /&gt;
Numite 1-2 skip lists, sunt deterministe, dar mai lente și mai greu de implementat.&lt;br /&gt;
&lt;br /&gt;
* între oricare 2 noduri de înălțime &amp;#039;&amp;#039;h&amp;#039;&amp;#039; există 1 sau 2 noduri de înălțime &amp;#039;&amp;#039;h&amp;#039;&amp;#039; - 1.&lt;br /&gt;
* inserare: dacă apar 3 elemente la același nivel, elementul din mijloc este înălțat cu 1&lt;br /&gt;
** presupune realocare, deci poate fi O(log&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; n)&lt;br /&gt;
* la ștergere, elementele pot fi urcate sau coborâte cu un nivel&lt;br /&gt;
* deoarece înălțimea nodurilor variază, numărul de pointeri spre dreapta se poate schimba pe parcursul vieții unui element&lt;br /&gt;
* soluție 1: listă de pointeri în loc de vector de pointeri&lt;br /&gt;
** dublează necesarul de memorie și numărul de indirectări&lt;br /&gt;
** fragmentarea memoriei&lt;br /&gt;
** anulează beneficiul cacheului de procesor&lt;br /&gt;
* soluție 2: pointerii next pentru fiecare element sunt într-un vector de pointeri realocat dinamic (dublare / înjumătățire când este cazul)&lt;br /&gt;
&lt;br /&gt;
== Drumuri în grafuri ==&lt;br /&gt;
&lt;br /&gt;
Avantaje:&lt;br /&gt;
&lt;br /&gt;
* trebuie neapărat făcute înainte de olimpiadă&lt;br /&gt;
&lt;br /&gt;
Algoritmi:&lt;br /&gt;
&lt;br /&gt;
* Bellman-Ford&lt;br /&gt;
* Dijkstra&lt;br /&gt;
** alegerea următorului nod cu vector sau cu min-heap&lt;br /&gt;
* Floyd-Warshall&lt;br /&gt;
* analize de complexitate&lt;br /&gt;
&lt;br /&gt;
== Structuri de mulțimi disjuncte ==&lt;br /&gt;
&lt;br /&gt;
Avantaje:&lt;br /&gt;
&lt;br /&gt;
* banal de implementat&lt;br /&gt;
* apar des în practică&lt;br /&gt;
&lt;br /&gt;
Le-am predat pe fugă pentru algoritmul lui Kruskal. Ar merita reluate, dar probabil nu vor umple decât vreo oră.&lt;br /&gt;
&lt;br /&gt;
== Parcurgeri Euler / LCA / RMQ / artificiul cu &amp;lt;math&amp;gt;\sqrt{n}&amp;lt;/math&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Avantaje:&lt;br /&gt;
&lt;br /&gt;
* introduce noțiunea de preprocesare + query&lt;br /&gt;
* introduce artificiul cu &amp;lt;math&amp;gt;\sqrt{n}&amp;lt;/math&amp;gt;, util în multe situații&lt;br /&gt;
* mulți algoritmi clasici ușurei&lt;br /&gt;
* oricare din problemele astea pot fi date și ca teme de gândire&lt;br /&gt;
&lt;br /&gt;
Nu cred că trebuie dusă până la soluția cu O(1) per query. &amp;lt;math&amp;gt;O(\sqrt{n})&amp;lt;/math&amp;gt; sau &amp;lt;math&amp;gt;O(\log{n})&amp;lt;/math&amp;gt; este suficient pentru ei.&lt;br /&gt;
&lt;br /&gt;
Idei de predare:&lt;br /&gt;
&lt;br /&gt;
=== Parcurgere Euler ===&lt;br /&gt;
&lt;br /&gt;
* definiție, exemplu&lt;br /&gt;
* aplicație: se dă un arbore și &amp;#039;&amp;#039;n&amp;#039;&amp;#039; interogări de forma (&amp;#039;&amp;#039;u&amp;#039;&amp;#039;, &amp;#039;&amp;#039;v&amp;#039;&amp;#039;). Să se spună, în fiecare caz, dacă (a) &amp;#039;&amp;#039;u&amp;#039;&amp;#039; este strămoș al lui &amp;#039;&amp;#039;v&amp;#039;&amp;#039;, (b) &amp;#039;&amp;#039;v&amp;#039;&amp;#039; este strămoș al lui &amp;#039;&amp;#039;u&amp;#039;&amp;#039; sau (c) niciuna dintre acestea.&lt;br /&gt;
&lt;br /&gt;
=== RMQ ===&lt;br /&gt;
&lt;br /&gt;
* expunerea problemei&lt;br /&gt;
* fără precalculare, răspunsuri în O(n)&lt;br /&gt;
* cu precalcularea tuturor sumelor, O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) memorie necesară&lt;br /&gt;
** precalcularea poate fi făcută naiv în O(n&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;) sau cu programare dinamică în O(n&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;)&lt;br /&gt;
** apoi, O(1) per interogare&lt;br /&gt;
** dorim cel mult O(n) memorie suplimentară, vezi secțiunea următoare&lt;br /&gt;
&lt;br /&gt;
=== Artificiul cu &amp;lt;math&amp;gt;\sqrt{n}&amp;lt;/math&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
* explicație pentru RMQ&lt;br /&gt;
* multe exemple similare pe [http://infoarena.ro/blog/square-root-trick infoarena]. Aș alege două:&lt;br /&gt;
** suma unei subsecvențe (elementele se pot actualiza dinamic)&lt;br /&gt;
** calcularea celei mai lungi subsecvențe comune cu mai puțin de O(&amp;#039;&amp;#039;m&amp;#039;&amp;#039; * &amp;#039;&amp;#039;n&amp;#039;&amp;#039;) memorie&lt;br /&gt;
* de ce tocmai &amp;lt;math&amp;gt;\sqrt{n}&amp;lt;/math&amp;gt;?&lt;br /&gt;
** dacă împărțim vectorul în &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; segmente, atunci efortul necesar este &amp;lt;math&amp;gt;O(p + \frac{n}{p})&amp;lt;/math&amp;gt;&lt;br /&gt;
** ecuație de gradul doi, minimul se atinge pentru &amp;lt;math&amp;gt;p = \sqrt{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LCA ===&lt;br /&gt;
&lt;br /&gt;
* expunerea problemei&lt;br /&gt;
* legătura cu parcurgerea Euler și RMQ: parcurgerea Euler reduce problema la RMQ&lt;br /&gt;
&lt;br /&gt;
=== Opțional, algoritmi cu &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt; preprocesare, &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt; memorie necesară și &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; per interogare ===&lt;br /&gt;
&lt;br /&gt;
* de exemplu, pentru RMQ stocăm toate sumele de lungimi 1, 2, 4, 8, ...&lt;/div&gt;</summary>
		<author><name>Cata</name></author>
	</entry>
</feed>