Hogyan kell megszámolni a különböző elemek számát egy struktúrában C nyelven?
Pontosabban nem a struktúra különböző elemeit szeretném megszámolni, hanem, hogy egy oszlopban hány különböző elem van. Így néz ki a struktúrám
struct helyjegy
{
int le;
int fel;
int jegyar;
};
Így deklaráltam a struktúrát:
struct helyjegy tomb[sor]
A tomb[i].le különböző elemeit szeretném megszámolni.
Gondolom ehhez for ciklus kell, csak nem tudom, mit kell beleírni, hogy csak a különbözőeket számolja meg, ne azt, hogy hány sora van a fájlnak, amiből a struktúrát készítettem.
Nagyon egyszerű és pazarló megoldás: fogj egy üres int tömböt. Menj végig a struktúra tömbön és minden elemre: menj végig az int tömbön és nézd meg, hogy a le érték benne van-e. Ha nincs, akkor tedd bele, majd minden esetben lépj a következő struktúra elemre.
Sokkal szebb megoldás lehet, ha egy int-re úgy tekintesz, mint egy 0-ákból és 1-esekből álló tömbre, aminek az x. helyén ha 0 van, akkor az x, mint érték még nem szerepelt a struktúrában, ha 1-es van, akkor szerepelt. Ekkor mégy végig a struktúrán és bitmüveletekkel tudod ellenőrizni, hogy volt-e már az adott int v. sem.
Ezt lényegesen komplikáltabb megcsinálni, de sokkal gyorsabban fog futni.
Van valamilyen megkötés a "le" értékkészletére? (Pl. -100-tól 100-ig vehet fel értéket)
Ha igen, akkor:
- csinálj még egy tömböt: int voltmar[201]; // a [-100;100] intervallumnak 201 eleme van (egész szám); ez tartalamzza a már előfordult elemeket
- for (int i=0; i < 201; ++i) voltmar[i]=0; // kinullázunk mindent
- for ciklussal járd be a "tomb" nevű tömbödet:
for (int i=0; i < sor; ++i) {
if (voltmar[tomb[i].le+100]==0) { // a -100 miatt hozzá kell adni 100-at!
voltmar[tomb[i].le+100]=1;
++c; // ebben számolod a különböző elemeket
}
}
A tárhelyben nagyon spórolós és időben nagyon pazarló megoldás pedig az alábbi:
Rendezed a tömböt quicksort-tal először az első oszlopra. Ha megvan, akkor egy számlálót beállítasz 1-re, majd végigmész a tömbön i-vel 1-től a tömb végéig. Ekkor a hányszor tömb[i] nem egyenlő tömb[i-1]-gyel, annyiszor növeled a számlálót 1-gyel. A ciklus végén a számlálóban van az oszlopra vonatkozó érték.
PL. ha a tömböd egy oszlopa sorra az alábbi értékeket veszi föl:
6 2 8 3 1 0 9 4 1 6 3
rendezés után:
0 1 1 2 3 3 4 6 6 8 9
a számláló értéke a ciklus lépései után:
1 2 2 3 4 4 5 6 6 7 8
Tehát 8-féle érték volt.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!