Algoritmu, ktery jsem uvedl v prispevku, je maximalne efektivni
Je dost odvážné tvrdit o něčem, že je to maximálně efektivní, když neznáte přesné zadání. Váš algoritmus ponechá původní velikost podkladového pole, takže není paměťově efektivní. Kdybyste to chtěl spravit zavoláním trimToSize(), bude zase výpočetně neefektivní (nevíte, zda to zmenšení pole není zbytečné).
Presne zadani jsem ocekaval v prvnim prispevku tohoto fora.
Ponechava puvodni velikost podkladoveho pole a povazuji to za dobrou vlastnost. To z toho duvodu, ze 1) pro jakoukoliv dalsi naslednou operaci, ktera ma za nasledek zmenu velikosti listu neni rozumne toto provadet automaticky a 2) mame onu metodu trimToSize, ktera toto dela na vyzadani. To, ze tam nejake pole je, je vlastnosti ArrayListu a je treba s tim pracovat. Nasledna prace se zmenou velikosti pole nebyla pozadovana.
Dovoluji si tvrdit, ze to je maximalne efektivni algoritmus proto, ze pouziva pouze pristup do 2 poli pres index a jeho narocnost neni vyssi nez narocnost jednoho pruchodu podkladoveho pole. Pokud nemam pravdu, tak by to chtelo necim konkretnim dolozit (efektivnejsim algoritmem, at to neni pouze akademicka debata).
Dalsi uvadene zpusoby zalozene na kopirovani (neodstranuje elementy a dopredu nevime jako bude mit vysledny list velikost, pouze ze bude mensi nebo stejne velky - opet skryte kopirovani pole pri rustu velikosti vysledneho listu) nebo odstranovani prvku z puvodniho listu (volanim metody remove) jsou mene efektivni. Odstranovani pro kazde volani posouva zbytek pole za odstranenym elementem. To je nevyhoda ArrayListu. Je to wrapper nad polem, ktery dela presne to, co ma delat a jeho vlastnosti plynou uz ze jmena teto struktury *Array*List.