Autor Zpráva
MartinJJ
Profil *
Dobrý den,

Mám array v PHP, který může mít byť jen pár položek, tak i stovky tisíc položek.
Pokud to správně chápu, tak in_array() prochází všeechny položky vzestupně, tedy od indexu 0 až do indexu n. V mých polích většinou hledám hodnotu, která je až na konci tohoto listu, což znamená, že bych nejraději začínal u n a postupně sestupoval k nule.

Použití funkcí pro přeskládání pole by podle mého názoru jen zpomalilo celou operaci kvůli znovuindexování. Takže je nějaký parametr nebo jiná funkce v PHP, kde můžu specifikovat, že chci tačínat od konce? Díky moc za rady.
Kajman
Profil
Zkuste si změřit na velkém poli, jak dlouho array_reverse trvá. Třeba to bude akceptovatelný čas.

Jinak pokud je to pole s číselným indexem bez mezer, tak si i můžete napsat vlastní funkci s cyklem for, který bude snižovat index stanovený dle délky pole.
blaaablaaa
Profil
MartinJJ:
Pokud jde o unikátní hodnoty, mělo by být rychlejší použít isset. Každopádně by bylo lepší napsat sem, o jaká jde data, třeba existuje lepší řešení.
MartinJJ
Profil *
Kajman, blaaablaaa:
Jedna se o unikátní číselné hodnoty, klasický unsigned int32. Data pouze konvertuji z JSON dokumentu do PHP array. Udělám nějaké testování s 500kb listem a dám vědět výsledky.


blaaablaaa:
Asi je 12000 položek pořád málo. Ať je hodnota na konci či na začátku, tak se script vykoná za 0,015s. Takže PHP bude asi hodně dobře optimalizované.
Keeehi
Profil
MartinJJ:
Záleží, kolikrát nad tím polem vyhledáváš. Pokud jednou, přestavění celého pole je samozřejmě náročnější než jeho jednoduché projití. Pokud se prochází vícekrát je teoreticky možné uvažovat nad nějakou optimalizací. A i když by nějaká optimalizace existovala a zlepšila rychlost třeba 10x, vždy se stojí za to ptát, zda to má cenu. Zda mě trápí že to běží 0,0150s a ne 0,0015s. Většina optimalizací je za cenu vyšší složitosti kódu což je cena kterou téměř nikdy nechceš platit. Je zbytečné optimalizovat něco, co funguje dostatečně dobře pro tvé potřeby.

Nicméně, pokud bys chtěl být opravdu optimální, tak za předpokladu že jednou vytvoříš pole a pak v něm hledáš existují asymptoticky lepší způsoby než postupné procházení. Například můžeš to pole nejdříve seřadit. To je si náročnější operace než jeho otočení avšak vyhledávání je v něm pak velmi rychlé. Podíváš se doprostřed a zjistíš, zda je hledaná hodnota větší nebo menší. Podle toho se rozhodneš kterou z půlek budeš prohledávat a kterou se nemusíš zabývat, jelikož víš, že tam určitě nebude. Jedno podívání ti tak sebralo polovinu prvků, které bys musel prohledávat. No a na té půlce, kde by ten hledaný prvek mohl být provedeš to samé. A tak dál a tak dál, dokud prvek nenajdeš nebo nezjistíš, že tam ten hledaný prvek není. Na hledání v poli velikosti 1000 potřebuješ na nalezení/nenalezení maximálně přečíst a porovnat 10 prvků, na 1 000 000 poli potřebuješ 20 porovnání, na 1 000 000 000 jen 30 porovnání. Dají se s tím ale dělat i další kouzla pokud víš dopředu něco o rozložení prvků v tom poli. Protože nemusíš vždy začínat v prostředku ale pokud dokážeš nějak predikovat kde by se ten prvek mohl teoreticky nacházet, můžeš se pokusit začít hledat v jeho okolí. Nicméně tohle je už dost advanced a tebe se určitě týkat nebude.
MartinJJ
Profil *
Keeehi:
Díky moc. K tomuhle to asi potřeba nebude, ale je dobré tohle vědět do budoucna, jelikož v dalších semestrech budu pracovat s velkými objemy dát, nejen v polích.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0