Najdite druhy najvacsi prvok

Programovacie jazyky, rady, poradňa...
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Najdite druhy najvacsi prvok

Príspevok od používateľa Gregi »

Len pozriet ockom, kde sa da este optimalizovat algoritmus, popripade usetrit pamat 8) .
Viem ze to v pripade 2 najvacsich prvkov vyberie prave tie prvky no ratam, ze prvky nebudu opakujuce sa. Ak len predsa tak staci pridat podmienku k druhemu IF (AND ....). Beriem to vsak tak, ze takto su to 2 najvacsie prvky a jeden z nich je vlastne druhy.

Kód: Vybrať všetko

program Druhy_prvok;
uses Crt;
const
  pocet = 10; { pocet triedenych, generovanych prvkov }
var
  pole: array[1..pocet] of Byte;
  x: Integer;
  max,prvy,druhy: Byte;

BEGIN
{ vymaz obrazovku }
  ClrScr;
{ generovanie prvkov pola }
  Randomize;
  for x := 1 to pocet do begin
    pole[x] := Random(255);
    Write (pole[x],',');
  end;
  prvy := 1;
  druhy := 1;
  max := pocet;
{ algoritmus }
  while max>1 do begin
    if pole[max] > pole[prvy] then begin
      druhy := prvy;
      prvy := max;
    end
{ porovnanie druheho prvku }
    else
      if pole[max] > pole[druhy] then
        druhy := max;
    dec (max);
  end;
  WriteLn;
  WriteLn ('PRVY : ',pole[prvy]:3,'[',prvy,']');
  WriteLn ('DRUHY: ',pole[druhy]:3,'[',druhy,']');
  ReadLn;

END.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa mirak2 »

nechce sa mi lustit v tom debilnom pascale, ale robil by som to tak, ze prechadzam polom a pamatam si najvacsie dve cisla...kazdy prvok najprv porovnam s max2, ak je mensi, idem dalej, ak je vacsi porovnam s max1, ak je vacsi, tak do max2 hodim hodnotu z max1 a aktualny prvok dam do max1, ak je mensi tak do max2 dam ten prvok...na zaciatku porovnas prve dva prvky a vacsi das do max1, mensi do max2 a zacinas prechadzat polom od 3. prvku v poli....na konci vypises max2...neviem ci vymyslis nieco menej narocne na pamat a cas
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa Gregi »

No presne tak to riesim v mojom programe ;-)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa audiotrack »

presne tak nie, lebo ty nastavíš oba prvky na prvú hodnotu a tým pádom robíš jednu iteráciu zbytočne
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa Gregi »

Ok, takze Ty mas na mysli nieco taketo? lenze ak to ma byt takto tak sa mi to ako rychlejsie, natoz kompaktnejsie riesenie vobec nezda.

Kód: Vybrať všetko

program Druhy_prvok;
uses Crt;
const
  pocet = 10; { pocet triedenych, generovanych prvkov }
var
  pole: array[1..pocet] of Byte;
  x: Integer;
  max,prvy,druhy: Byte;

BEGIN
{ vymaz obrazovku }
  ClrScr;
{ generovanie prvkov pola }
  Randomize;
  for x := 1 to pocet do begin
    pole[x] := Random(255);
    Write (pole[x],',');
  end;
  if pole[1] > pole [2] then begin
    prvy := 1;
    druhy := 2;
  end
  else begin
    prvy := 2;
    druhy := 1;
  end;
  max := pocet;
{ algoritmus }
  while max>2 do begin
    if pole[max] > pole[prvy] then begin
      druhy := prvy;
      prvy := max;
    end
{ porovnanie druheho prvku }
    else
      if (pole[max] > pole[druhy]) then
        druhy := max;
    dec(max);
  end;
  WriteLn;
  WriteLn ('PRVY : ',pole[prvy]:3,'[',prvy,']');
  WriteLn ('DRUHY: ',pole[druhy]:3,'[',druhy,']');
  ReadLn;

END.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa mirak2 »

algoritmus je s makkym i (ten cigan je s tvrdym :lol:)
bud pojdes od zaciatku pola (ako bezny clovek) a nechas tie podmienky vnutri while ako mas - zacnes potom tretim prvkom a opakujes po pocet
alebo
pojdes od konca ako ty a tie podmienky zmenis na pole[pocet]>pole[pocet-1] a potom podla toho to aj priradis...a zacnes opakovat od prvku pole[pocet-2] a pojdes po 1
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa Gregi »

mirak2 napísal:algoritmus je s makkym i (ten cigan je s tvrdym :lol:)
bud pojdes od zaciatku pola (ako bezny clovek) a nechas tie podmienky vnutri while ako mas - zacnes potom tretim prvkom a opakujes po pocet
alebo
pojdes od konca ako ty a tie podmienky zmenis na pole[pocet]>pole[pocet-1] a potom podla toho to aj priradis...a zacnes opakovat od prvku pole[pocet-2] a pojdes po 1
Joooj, veruze mas pravdu. Hambim sa za to a hned to opravim :smt017 . Ak mas cas, mohol by si mi tu dat to Tvoje riesenie? Akosi sa v tych vasich poznamkach stracam a tapam co vlastne mate na mysli.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa mirak2 »

moje riesenie neexistuje, nakolko som pascal tri roky nekodil, a ani sa mi v nom nechce, popisem ti to slovne:
1. porovnaj pole[1] s pole[2], vacsi daj do prvy, mensi do druhy
2. nastav premennu i na 3 (ty ju mas pomenovanu max, nie velmi vhodne, ked sa pozries o mesiac na ten program nebudes ani len tusit ktora premenna je na co, pomenovavaj ich s rozumom)
3. ak i je mensie alebo rovne ako pocet tak 4. inak skonc
4. ak pole je vacsi ako pole[druhy] pokracuj na 5., inak preskoc na bod 6.
5. ak pole je vacsie ako pole[prvy] tak druhy je prvy a prvy je i, inak druhy je i
6. zvys i o jedna a prejdi na 3.
aby si nebol pomyleny uz uplne - ta 3 je podmienka vo while
Gregi
Light Star
Light Star
Príspevky: 224
Registrovaný: 24 mar 2005, 11:34

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa Gregi »

Takze asi takto:

Kód: Vybrať všetko

program Druhy_prvok;
uses Crt;
const
  pocet = 10; { pocet triedenych, generovanych prvkov }
var
  pole: array[1..pocet] of Byte;
  x: Integer;
  i,prvy,druhy: Byte;

BEGIN
{ vymaz obrazovku }
  ClrScr;
{ generovanie prvkov pola }
  Randomize;
  for x := 1 to pocet do begin
    pole[x] := Random(255);
    Write (pole[x],',');
  end;
  if pole[1] > pole[2] then begin
    prvy := 1;
    druhy := 2;
  end
  else begin
    prvy := 2;
    druhy := 1;
  end;
  i := 3;
{ algoritmus }
  while i < pocet do begin
    if pole[i] > pole[druhy] then
      if pole[i] > pole[prvy] then begin
        druhy := prvy;
        prvy := i;
      end
      else
        druhy := i;
    inc(i);
  end;
  WriteLn;
  WriteLn ('PRVY : ',pole[prvy]:3,'[',prvy,']');
  WriteLn ('DRUHY: ',pole[druhy]:3,'[',druhy,']');
  ReadLn;

END.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Najdite druhy najvacsi prvok

Príspevok od používateľa mirak2 »

moze byt
Napísať odpoveď