Azonos szavak száma a szövegben

Címkék
Azonos szavak száma a szövegben
2018-03-25T16:45:41+02:00
2018-03-25T21:12:16+02:00
2022-08-18T20:41:53+02:00
HelloWorld
Sziasztok!

Egy nagy problémába ütköztem! Elkezdtem tanulni az assembly x86-ot. Nagyon kezdő vagyok, és az a feladatom, hogy bekérjek egy szöveget, amelyben a szavak szóközzel vannak elválasztva egymástól. A szöveget addig kérem, míg le nem ütöm a "new line" karaktert. A szövegben meg kell viszgálnom, hogy hányszor fordul elő a legtöbbször előforduló szó:

Példa:
alma körte szilva alma -> Ebben az esetben 2 a megoldás

alma körte szilva banán -> Itt 1 a megoldás, mert legmagasabb előfordulás száma az 1

Hogyan kivitelezhető ez a feladat a legegyszerűbben? Én olyan megoldásra gondoltam, hogy bekérem a szavakat, minden szóköznél elmentem az addigi karaktereket sztringbe. Veszek egy countert, amelynek értéke 1. Ha ez elkészült az összes szóval, akkor fogom az első sztringet, összehasonlítom a többi stringgel, ha egyezik, növekszik a 2. counter. Megvizsgálom, hogy a 2. counter nagyobb-e mint az első. Ha igen, akkor átmentem az első counter értékébe a második counter értékét, majd a 2. countert kinullázom.  Utána veszem a második sztringet, azt is összehasonlítom az utána lévő sztringekkel, és ha egyezés van, akkor elmentem a 2. counterbe. Vizsgálás. Ezt szépen folytatom az utolsó szóig. Ez kivitelezhető vagy nagyon bután gondolkodom? Van ennél sokkal efektívebb megoldás is?

Minden választ előre is köszönök!
Mutasd a teljes hozzászólást!
C-szerű pszeudokódban valami ilyesmit csinálnék legegyszerűbb megoldásnak:

int trallala(int darab,char *szavak[]){ int max=0 for(int i=0;i<darab;i++){ int aktualis=1; for(int j=i+1;j<darab;j++) if(strcmp(szavak[i],szavak[j])==0) aktualis++; if(aktualis>max)max=aktualis; } return max; }
ez nagyrészt egyezik azzal, amit körülírtál.

Utána lehet optimalizálgatni, egy ötlet pl ez:

int trallala(int darab,char *szavak[]){ char **masolat=malloc(darab*sizeof(char*)) memcpy(masolat,szavak,darab*sizeof(char*)) int max=0 for(int i=0;i<darab;i++){ int aktualis=1; for(int j=i+1;j<darab;j++) if(strcmp(masolat[i],masolat[j])==0){ aktualis++; darab--; masolat[j]=masolat[darab]; j--; } if(aktualis>max)max=aktualis; } free(masolat); return max; }
Ebben annyi extra van, hogy a duplikátumokat eltávolítja a tömbből, ezért később már nem áll neki újra összeszámolni őket. Ehhez viszont egy saját, szabadon pusztítható példányra van szükség, erről szól a "masolat".

Ha viszont nagyon sok szavad van, akkor érdemes róluk valamilyen ellenőrző összeget készíteni ("hash"), azt összehasonlítani elsőnek, és csak egyezéskor ráengedni a strcmp-t.
Mutasd a teljes hozzászólást!

  • - kell egy compare függvényt írnod, amely a belépési ponttól a  > 0x20-ig megy. Hiszen a szóköz és \n a szó végét jelenti.
      - kell egy vektor, amely minden tagja két elem [belépési pont        találat]
      - ha nem egyezik az eddig meglevő belépési pontok szavainak egyikével (compare), akkor felveszed a belépési pontjának címével, találat=1
      - ha egyezik az eddigi valamelyikébel, akkor a meglevő találat+=1 lesz
    A végén pedig csak végigszaladsz és a legnagyobb találati számot keresed.
    Mutasd a teljes hozzászólást!
  • Offtopic elnézést: Érdekelne, hogy miért pont Assembly x86-ot kezdtél el tanulni? Ha C-vel vagy Pythonnal ismerkednél, rengeteg példakódot és segédanyagot találnál, és hasznos tudásra tennél szert. Arról nem is beszélve, hogy kezdőként sokkal nagyobb sikerélményed lenne.  Az Assemblyről ugyanez nem mondható el, manapság kézzel PC-re szerintem már senki se ír ilyen alacsony szintű kódot, legfeljebb nagyon speciális esetben egy C kódba ágyazva. (ezértvalakibiztosanafejemetveszi) Amennyiben az Assembly a szíved választottja, az istenért se akarlak lebeszélni, csak érdekel a háttérben rejlő motiváció.  
    Mutasd a teljes hozzászólást!
  • Gondolom valami egyetemen valami beadandó, azért csinálja, nem lelkesedésből. Amúgy teljesen igazad van, nem a legjobb az asm kezdésnek
    Mutasd a teljes hozzászólást!
  • Assembly oktatás: elvben kettő előnye van, ha jól oktatják és megfelelő időt szánnának rá. Egyik, hogy az architektúrát részben megismerhetné a hallgató, másrészt erőteljesen logikát fejleszt. Ha viszont nem jól oktatják vagy időhiányosan, akkor csak elrettentő példának jó.

    A gyakorlatban ha nagyon gyors futású kód kell, akkor C-ben sok apróságra odafigyelve, a mai C fordítóval fordítva nagyon ritka speciális kivételtől eltekintve nem lesz lassabb futású a produktum a direkt assembly-hez képest. Ráadásul a fordítóval x86, ARM, MIPS, AVR32, RISCV architektúrákra egyaránt fordul a C-ben megírt algoritmus.
    Mutasd a teljes hozzászólást!
  • Így is csinálhatod, de nem nullázod a 2.  countert hanem 1-re állítod be. Persze csak ha nem 0 számú a bemeneti szavak száma. 
    Vagy úgy hogy egyetlen stringbe mented, aztán abban lépkedsz. Ahogy kócos írja. Annyi különbséggel, hogy én nem vektorral csinálnám, hanem a két countereddel.
    Mutasd a teljes hozzászólást!
  • Nagyon csodálkoznék hogy ha egyetemen x86 assembly menne.. Az hogy demonstrálják magát az Assembly-t egy kis PIC-et programozva és ledeket villogtatva még oké, de hogy x86, az elég megdöbbentő lenne 
    Mutasd a teljes hozzászólást!
  • Hali!

    Az off-olást, kérem, fejezzétek be. A Tudástárban nincs helye ennek.

    Nem csak neked szól.

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
Címkék
abcd