[C++] Ile jest różnych liczb w tablicy

darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

Jak zliczyć ile jest różnych liczb w tablicy?
Ostatnio zmieniony 25 mar 2012, o 14:04 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

To jest tablica statyczna czy dynamiczna?
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

tablica statyczna
gryxon
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 30 gru 2011, o 02:21
Płeć: Mężczyzna
Lokalizacja: Puławy
Podziękował: 11 razy
Pomógł: 53 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: gryxon »

To zależy jaki masz przedział. Jeżeli liczby są z dużego przedziału to musisz użyć mapy/hashmapy.
Możesz ewentualnie przesortować tablice i raz przejechać się po niej dodając do wyniku jeden gdy masz zmiane wartości np:

Kod: Zaznacz cały

tab[i]!=tab[i+1]; ++wynik;
Jeżeli liczby są z niewielkiego przedziału możesz użyć dodatkowej tablicy booli(początkowo wyzerowanej). W każdym przebiegu pętli masz takie coś:

Kod: Zaznacz cały

if(tabbool[tab[i]] != 1){++wynik; tabbool[tab[i]]=1;}
Czyli jeżeli wartość pola tab jest równa \(\displaystyle{ 0}\) to w tablicy mamy wystąpienie nowej wartości.
Ostatnio zmieniony 23 mar 2012, o 18:27 przez gryxon, łącznie zmieniany 2 razy.
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

Różnych elementów, czyli że jeśli mamy załóżmy tablicę 10 elementową i jest w niej 6 czwórek, tzn. że liczba niepowtarzających się elementów jest 4 (nazywam to pierwszym przypadkiem), czy po prostu mamy wyeliminować powtórzenia tej liczby (drugi przypadek)?

Algorytm dla pierwszego przypadku
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
  • int z=0 (przechowuje informację ile razy dana liczba się powtórzyła)
  • int k=l+1 (na potrzeby pętli)
  • for (;k<x;k++)

Kod: Zaznacz cały

{
if (tab[l]==tab[k]) z++;
}
  • l=l+z+1 (licznik przechodzi na kolejny różny element)
  • if (z!=0) p=p+z+1;
6. Liczba elementów niepowtarzających się jest równa x-p

Algorytm dla drugiego przypadku (eliminacja powtórzeń liczby już występującej)
1. Zmiennej x przypisz ogólną liczbę elementów tablicy
2. int l=0 (licznik obrotów pętli, będzie wskazywać nam, który element w tablicy jest analizowany)
3. Przesortuj tablicę rosnąco
4. int p=0 (całkowita liczba powtórzeń)
5. dla l<x
  • int z=0 (przechowuje informację ile razy dana liczba się powtórzyła)
  • int k=l+1 (na potrzeby pętli)
  • for (;k<x;k++)

Kod: Zaznacz cały

{
if (tab[l]==tab[k]) z++;
}
  • l=l+z+1 (licznik przechodzi na kolejny różny element)
  • if (z!=0) p=p+z;
6. Liczba elementów niepowtarzających się jest równa x-p

Jeśli będziesz miał problem z zapisem całego kodu, daj znać.

[EDIT]
Czyli jak to ujął krótko gryxon, w moim sposobie chodzi o przesortowanie tablicy, potem sprawdzanie każdego niepowtarzającego się wcześniej elementu czy pojawia się w dalszych elementach tablicy, jeśli tak to dodajesz 1 do liczby powtórzeń. Całkowita liczba niepowtarzających się elementów będzie równa różnicy pomiędzy ilością wszystkich elementów tablicy, a liczbą elementów powtarzających się.
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

dzieki mam pytanie : mając dana tablice z parzystą liczbą elementów i chciałbym z niej wyjąć do drugiej tabeli tylko elementy o indeksach parzystych, jak to zrobic?
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

Utworzyłbym nową tablicę o rozmiarze równym połowie rozmiarowi poprzedniej, jeśli ilość elementów była parzysta, jeśli nie, to całość z połowy poprzedniej + 1.

Załóżmy, że ta nowa tablica to parzyste[], a poprzednia calosc[d] (d - ilość elementów)
Wtedy tworzymy pętlę

Kod: Zaznacz cały

int p=d/2 (dla parzystych)
int p=d/2 + 1 (dla nieparzystych)
int indeks=0;
for (int x=0; x<p; x++)
{
parzyste[x]=calosc[indeks];
indeks=indeks+2;
}
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

dzieki a jak zrobić jakby wyciagnąc nieparzyste[]?
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

Kod: Zaznacz cały

int p=d/2;
int indeks=1;
for (int x=0; x<p; x++)
{
parzyste[x]=calosc[indeks];
indeks=indeks+2;
}
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

jakoś z nie parzystymi mi nie wychodzi , dla parzystych ten program działa

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int main()
{
  int N;
  int j=0;
    cin >> N;
int tab[2*N];
int t[N];
int i;
for(i=0;i<2*N;i++) cin>>tab[i];

for(i=0;i<2*N;i++) 
{t[i]=tab[j];
j=j+2;}

for(j=0;j<N;j++)
cout<<t[j]<<endl;

    return 0;
}
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

Już sprawdzam co jest grane, ale pierwsze co zauważyłem, to stosujesz tablice statyczne w przypadku kiedy użytkownik sam podaje rozmiar tablicy. W takich przypadkach należy posłużyć się tablicą dynamiczną, ponieważ taki kod już z zasady nie przejdzie podczas kompilacji np. w MS Visual C++ 2010 Express.

Dodatkowo brak funkcji zatrzymującej okno konsoli, co uniemożliwia odczyt wyników pracy.
Daj przed return 0;

Kod: Zaznacz cały

cin.ignore();
getchar();

[EDIT]
najpierw dałeś

Kod: Zaznacz cały

int j=0;
a następnie

Kod: Zaznacz cały

for(i=0;i<2*N;i++) 
{
	t[i]=tab[j];
	j=j+2;
}
j zatem ma wskazywać na indeksy nieparzyste z tego co rozumiem. Błąd jest w deklaracji, ponieważ pierwszym indeksem nieparzystym jest 1, nie zero, zatem

Kod: Zaznacz cały

int j=1;
i już powinno wszystko grać.
Ostatnio zmieniony 23 mar 2012, o 19:54 przez iglomosh, łącznie zmieniany 2 razy.
darek20
Użytkownik
Użytkownik
Posty: 874
Rejestracja: 4 paź 2010, o 08:16
Płeć: Mężczyzna
Lokalizacja: wszedzie
Podziękował: 248 razy
Pomógł: 10 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: darek20 »

dzieki pomogło
Ostatnio zmieniony 23 mar 2012, o 19:58 przez darek20, łącznie zmieniany 1 raz.
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] Ile jest różnych liczb w tablicy

Post autor: iglomosh »

Sprawdziłem poprawiony kod (z j=1), działa bez zarzutu.
(Jakbyś nie zauważył to dałem edycję w poście wyżej, masz tam wyjaśnione, gdzie i jaki masz błąd)

EDIT
Służę pomocą
ODPOWIEDZ