Adott egy elemű egész számokat tartalmazó vektor.
Adjuk meg azt a és indexet, ami maximalizálja a részvektort. Az algoritmus műveletideje legyen .
Válasszuk ki a vektor második legkisebb elemét összehasonlítással.
Frissítés 2019 október 7.
A második feladatot Lőry megoldotta, de sose jutottunk el az első megoldásáig. Most kigondoltam, aztán ellenőrzésképpen rá is keresetem a neten...
Olyan sok lehetőségünk nincs, tekintve, hogy csak egyszer mehetünk végig az input vektoron. Világos, hogy valami olyan invariánst kell kereseni, amit a következő elemre lépve fent tudunk tartani, és a végén a feladat megoldását adja.
Egy lehetséges ötlet az, hogy minden indexre próbáljuk meghatározni azt a legnagyobb részösszeget, ami az adott elemnél végződik.
Ciklusváltozónak válasszuk a kis -t, és vezessük be a kis -t is, a hozzátartozó intervallum kezdetét, az összeg legyen és tartsuk még nyilván a maximum összeget is, valamint az ehhez tartozó nagy , indexeket.
Induláskor legyen és .
Ha megvagyunk -ig, akkor -re viszonylag könnyen átléphetünk, hiszen ha negatív volt, akkor új intervallumot kell kezdenünk, ha pedig pozitív, akkor érdemes az előzőt folytatni.
Ezután már csak a , és beállítgatása van hátra és kész is vagyunk:
function maxContiguousSum(A):
p = q = P = Q = 0
m = M = A[0]
for q in 1 .. A.length:
if m < 0:
(p, m) = (q, A[q])
else:
m = A\[q\] + m
if m > M:
(P, Q, M) = (p, q, m)
return (P, Q)
Ez a feladat egyébként az irodalomban maxium subarray problem néven ismert, a fenti megoldás pedig a Kadane algoritmus egy változata.