Csókavár

Egy vektor, két feladat

Adott egy elemű egész számokat tartalmazó vektor.

  1. Adjuk meg azt a és indexet, ami maximalizálja a részvektort. Az algoritmus műveletideje legyen .

  2. 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.