NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Algoritmus pro výpočet efektivních rozsahů

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Marty
Člen
Avatar
Marty:28.11.2019 19:23

Ahoj,

abych vysvětlil problematiku, tak mám např.list s 10 000 čísly v rozsahu 2 000 000 - 3 000 000. Ta čísla jsou občas postupně jdoucí, občas je mezi nimi skok, pak zase jdou postupně atd...

Dále mám formulář, kde můžu těch 10 000 čísel zadávat postupně, nebo v rozsahu. Pokud se hledá v rozsahu, zároveň existuje nějaký limit, kdy se po odeslání formuláře zobrazí na stránku pouze 500 výsledků ze zadaného rozsahu.

Mně jde o to, najít/vymyslet nějaký algoritmus, který by prošel těch 10 000 čísel a z čísel, která občas jdou po sobě nebo s nějakou malou mezerou vygeneroval/vy­počítal rozsahy (s tím limitem 500), které je efektivní hledat rozsahově, zbytek čísel dávat na druhou hromadu a ta se bude hledat po jednom.

PS: Celkem mi nezáleží na programovacím jazyku. Snažil jsem se něco najít na googlu, ale nic moc jsem nenašel. Existuje něco, co už někdo napsal a hodilo by se to na tento případ?

Díky. :)

 
Odpovědět
28.11.2019 19:23
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.11.2019 7:54

Tak, prvne si musis ujasnit, co mas za data v db. To mi neni z toho zadani uplne jasne.

  • jen cisla?
  • nebo i rozsahy?
  • a jsou cisla unikatni nebo se mohou opakovat?

Pokud tam jsou i rozsahy, tak je to slozitejsi, protoze budes hledat jeste propojeni na uz hotovy rozsah.
Pokud tam jsou cisla duplicitni, co se s nimi ma stat? Maji se odmazat nebo vytvorit novy rozsah?

Pokud mas jenom cisla, tak je staci seradit. A pak projit pole po dvou po sobe jdoucich a zda je rozdil 1. Pokud je, a prvni cislo uz je soucasti nejakeho rosahu, tak zvysis jeho max, rozsah = (min, max). Pokud neni, tak rozsah vytvoris a ulozis si jeho pozici, protoze s nim budes prave pracovat s dalsim cislem.

group = []; gi = 0; sgi = -1; // gi = group_index, sgi = selected_gi
cisla = [1, 2, 3, 4]; ci = 0;
cisla = cisla.sort();
for (ci=1; ci<cisla.length; ci++)
{
if (cisla[ci-1]+1 == cisla[ci]) // pokud jsou 2 po sobe jdouci
{
if (sgi>0) group[sgi].max = cisla[ci]; // pokud mam skupinu vybranou
else {gi++; sgi = gi; group[sgi] = [min:cisla[ci-1], max:cisla[ci]]} // pokud nemam, zalozim novou
}
else sgi = -1; // rozdil mezi cisly je vetsi nez 1, zrusit vyber skupiny
}

S hotovymi skupinami bys musel pri novem vyberu zkusit najit, skupinu, do ktere cislo zapadne min-1<=cislo<max+1 a jeste zjistit, jestli budes prepisovat jeji min nebo max hodnotu. A v pripade duplicit treba bude cislo meni min, max a nebudes prepisovat nic.
Tam mozna klicova je ta prvotni myslenka, cisla si seradit. Vetsina prog. jazyku ma funkci, ktera seradi cisla.
A samozrejme, cele to tez muzes resit pomoci sql prikazu, pokud to potrebujes nejak zazracne rychleji nez do 1-2s.

 
Nahoru Odpovědět
+1
29.11.2019 7:54
Avatar
Marty
Člen
Avatar
Odpovídá na Peter Mlich
Marty:1.12.2019 15:43

Ano, jsou to jen unikátní čísla. Už je mi to jasné, díky moc za nasměrování. Jdu to vyzkoušet. :)

 
Nahoru Odpovědět
1.12.2019 15:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.