Występowanie wartości wyszukiwania na połączonej liście w C ++

Występowanie wartości wyszukiwania na połączonej liście w C ++
W informatyce liczenie przypadków określonej wartości na połączonej liście jest typową operacją. Często wykonywane jest znalezienie częstotliwości elementu na liście, aby można go było używać do analizy danych, wyszukiwania i sortowania, między innymi. Na połączonej liście obliczanie liczby razy, w których wartość pojawia się często oznacza przejście listy i określenie, czy wartość każdego węzła jest zgodna z wartością docelową. Za każdym razem, gdy wykryto dopasowanie, liczba występów liczby jest następnie zwiększona. Algorytmy iteracyjne, rekurencyjne i oparte na skrócie można użyć do wykonania tej procedury, z których każdy ma własne korzyści i wady.

W C ++ istnieje wiele sposobów ustalenia, w jaki sposób element pojawia się na połączonej liście, w tym następujące:

Metoda iteracyjna: Technika iteracyjna sprawdza pole danych każdego węzła, gdy przemierza się powiązaną listę, aby zliczyć powtórzenia pożądanej wartości.

Metoda rekurencyjna: Lista połączona jest iterowana za pomocą funkcji rekurencyjnej w celu zliczenia powtórzeń wartości docelowej.

Metoda tabeli skrótów: Częstotliwość wartości docelowej jest zwracana przy użyciu techniki tabeli skrótów, która przechowuje częstotliwość każdego elementu na liście połączonej w tabeli HASH.

Podejście 1: Metoda iteracyjna

Metoda iteracyjna jest podejściem do rozwiązania problemu, w którym zadanie powtarza się do momentu spełnienia określonego warunku. Obejmuje sekwencję instrukcji, które są wykonywane wielokrotnie, albo określoną liczbę razy lub do momentu spełnienia określonego warunku. W tej metodzie rozwiązanie uzyskuje się poprzez wykonanie sekwencji obliczeń, z których każda opiera się na wynikach poprzednich obliczeń.

Metodę iteracyjną można zastosować do rozwiązania szerokiego zakresu problemów, od prostych obliczeń arytmetycznych po złożone algorytmy. Często jest preferowany niż metoda rekurencyjna, ponieważ jest bardziej prosta, łatwiejsza do zrozumienia i wymaga mniej kosztu pod względem zużycia pamięci.

// Ukończ program do wprowadzenia na połączoną listę w C++
#włączać
za pomocą przestrzeni nazw Std;
Węzeł klasy

publiczny:
dane int;
Węzeł *następny;
;
int crowcCurress (Node ** HeadNode, int Item)
int count = 0;
Węzeł *prąd = *headnode;
When (obecny != Null)
if (current-> data == item)
count ++;

current = current-> następny;

powrót;

void insertatbeginningLinkedList (węzeł ** headnode, int data)
// dynamicznie twórz pamięć dla tego nowości
Node* newNode = new Node ();
newNode-> data = data;
newNode-> next = *headnode;
*headNode = newNode;
Cout << newNode->dane << " inserted data successfully"
„W listy powiązanej” << endl;

void printLinkedList (węzeł* węzeł)
Cout << "\n";
// podczas gdy warunek zatrzyma się, gdy węzeł == null
While (węzeł!= Null)
Cout << node->dane << " "; node = node->Następny;

Cout << "\n" << endl;

int main ()

Węzeł* headnode = null;
insertatbeginninglinkedList (i headnode, 10);
insertatbeginninglinkedList (i headnode, 9);
insertatbeginninglinkedList (i headnode, 8);
insertatbeginningLinkedList (i headnode, 12);
InsertatBeginningLinkedList (i Headnode, 19);
insertatbeginninglinkedList (i headnode, 8);
printlinkedList (HeadNode);
int Search_Item = 8;
Cout<<"The number of times "<Cout<powrót 0;

Wyjście:

10 Wstawione dane z powodzeniem Into Into Into List
9 Włoczone dane pomyślnie powiązane Lista
8 Lista powiązanych z pomyślnie wprowadzoną dane
12 Lista powiązanych z pomyślnie wprowadzoną dane
19 Wstawione dane z powodzeniem Intointo Lista
8 Lista powiązanych z pomyślnie wprowadzoną dane
8 19 12 8 9 10
Liczba występuje 8, wynosi 2

Wyjaśnienie:

Iteracyjna metoda zliczania wystąpień określonego elementu na połączonej liście jest zaimplementowana w poprzednim kodzie.

Pierwszym krokiem jest zdefiniowanie klasy „węzła”, która ma dwie zmienne członkowskie: „Dane”, które służą do przechowywania wartości każdego węzła i „następnego”, który jest odniesieniem do węzła po nim na liście.

Dane liczb całkowitych i podwójny wskaźnik do węzła głównego listy są przekazywane do funkcji InsertBeginningLinkedList (). Korzystając z nowego węzła (), pamięć nowego węzła jest dynamicznie tworzona, a następnie dane są przypisywane do nowego węzła. Później aktualizuje węzeł główny, aby był nowym węzłem, ustawiając następny wskaźnik nowego węzła do poprzedniego węzła głównego.

Wskaźnik węzła głównego listy i element do wyszukiwania to dwa wejścia, które są podane do funkcji CountCurress (). Funkcja zwraca, ile razy element pojawia się na połączonej liście. Funkcja zaczyna się od ustawienia zmiennej liczby na 0 i odniesienie bieżącej zmiennej do węzła głównego listy połączonej. Metoda następnie rozpoczyna pętlę, która działa tak długo, jak „prąd” nie jest zerowy, znak, że koniec listy jest nadal w zasięgu. Funkcja określa, czy pole danych bieżącego węzła jest równe wartość celu dla każdej iteracji pętli (pozycja). Zmienna liczby jest zwiększona. Jeśli tak, pętla kontynuuje, dopóki nie odwiedzimy każdego węzła na liście, w którym to czasie „prąd” jest modyfikowany, aby wskazać następujący węzeł. Funkcja zwraca końcową wartość liczby, która oznacza liczbę razy, gdy element pojawia się na liście, po zakończeniu pętli.

PrintLinkedList (): Drukuje wartości wszystkich węzłów na listy powiązanej. Przenosi wskaźnik do pierwszego węzła na liście jako wejście.

W funkcji main () tworzona jest pusta lista połączona, inicjowanie węzła głównego do NULL. Następnie funkcja wykorzystuje funkcję INSERTATBeginningLinkedList, aby wstawić kilka wartości do listy. Wreszcie lista jest drukowana, a liczba wystąpień liczby 8 jest liczona i wyświetlana za pomocą frainCurrences i funkcji printlinkedlist.

Przemierzamy pełną listę tylko raz. Stąd czasowa złożoność naszej metody to O (n), gdzie n jest liczbą węzłów na liście.

Podejście 2: Metoda rekurencyjna

Metoda rekurencyjna to funkcja, która wywołuje się jako podprogram. Ideą rekurencji jest rozbicie problemu na mniejsze podproblemy, aż stanie się wystarczająco proste, aby go rozwiązać bezpośrednio. Funkcja rekurencyjna następnie łączy rozwiązania podproblemów, aby utworzyć rozwiązanie pierwotnego problemu. W informatyce rekurencja jest szeroko stosowana w wielu algorytmach i strukturach danych, takich jak sortowanie i wyszukiwanie, w celu zmniejszenia złożoności rozwiązywania dużych problemów poprzez dzielenie ich na mniejsze, łatwiejsze do rozwiązywania podproblemów.

#włączać
za pomocą przestrzeni nazw Std;
Węzeł klasy

publiczny:
dane int;
Węzeł *następny;
;
int crowcCurressRecursive (węzeł *headnode, int item)
if (headnode == null)
powrót 0;

int count = crowcCurrenceRecursive (headNode-> następny, item);
if (headNode-> data == item)
count ++;

powrót;

int main ()
Węzeł *headnode = nowy węzeł;
Węzeł *secondNode = nowy węzeł;
Węzeł *trzecinode = nowy węzeł;
HeadNode-> data = 11;
HeadNode-> następny = secondNode;
secondNode-> data = 12;
secondNode-> następny = trzecinode;
trzecinode-> data = 11;
trzecinode-> next = null;
int cel = 11;
int count = crowcCurressRecursive (headnode, cel);
Cout << "Count of " << target << " is: " << count << endl;
powrót 0;

Wyjście:

Liczba 11 to: 2

Wyjaśnienie:

  1. Klasa węzłów, która ma dane członków i następne, służy do zdefiniowania połączonej listy.
  2. Odniesienie do głowicy listy powiązanej i elementu do zliczenia są dwa wejścia metody craliccurrenceRecursive ().
  3. Gdy głowa równa się NULL, początkowa sprawa Recursion, która powoduje, że zwraca 0, zwraca 0.
  4. Rekurencyjnie funkcja wywołuje za pomocą kolejnego węzła LISTY.
  5. Jeśli dane bieżącego węzła pasują do celu po wywołaniu rekurencyjnym, liczba jest zwiększona.
  6. Funkcja zwraca całkowitą liczbę.
  7. Element docelowy jest ustawiony na 11, a lista połączona z trzema węzłami jest konstruowana w głównej funkcji.
  8. Wywołanie cralicCurressRecursive () z głową linkowanej listy i elementem docelowym jako parametry daje liczbę elementu docelowego.

Podejście 3: Metoda tabeli skrótów

Struktura danych o nazwie Tabela skrótów umożliwia wykonywanie przeglądów parami kluczowej wartości kluczowej w stałym czasie O (1). Funkcjonuje za pomocą klucza do obliczenia indeksu w szeregu szczelin lub wiader, z którego można znaleźć potrzebną wartość. Tabela skrótów przechowuje pary wartości kluczowej, które są następnie podzielone zgodnie z funkcją skrótu w różnych wiadrach.

Implementacja tabeli skrótów dla C ++ jest możliwa dzięki mapie standardowej biblioteki szablonu (STL). Pary kluczowe przechowywanie i pobieranie można wykonać za pomocą tego szybko i skutecznie. Z następującą składnią zadeklarowano nieorządkowane_map:

#włączać
UNOPORDED_MAP Hashtable;

Gdzie „klucz” oznacza rodzaj klawiszy w tabeli skrótów, a „wartość” oznacza typ wartości przechowywanych. Korzystając z Square Bracket Operator [], UNOPORDED_MAP umożliwia szybkie i efektywne wstawienie, usunięcie, usuwanie i wyszukiwanie. Na przykład możesz wykonać następujące informacje, aby dodać parę wartości kluczowej do nieorządkowanego_map:

hashTable [key] = wartość;

Obliczenie wartości skrótu i ​​umieszczenie pary wartości kluczowej w odpowiednim wiadrze są obsługiwane automatycznie przez UNOPORDED_MAP.

#włączać
#włączać
za pomocą przestrzeni nazw Std;
Węzeł klasy

publiczny:
dane int;
Węzeł *następny;
;
int crowcCurrenceShash (węzeł *głowa, int target)
STD :: UNORDED_MAP częstotliwość;
Węzeł *prąd = głowa;
When (obecny != Null)
częstotliwość [Current-> Data] ++;
current = current-> następny;

Częstotliwość powrotu [cel];

int main ()
Węzeł *headnode = nowy węzeł;
Węzeł *secondNode = nowy węzeł;
Węzeł *trzecinode = nowy węzeł;
HeadNode-> data = 11;
HeadNode-> następny = secondNode;
secondNode-> data = 12;
secondNode-> następny = trzecinode;
trzecinode-> data = 11;
trzecinode-> next = null;
int cel = 11;
int count = crowcCurrenceShash (headnode, target);
Cout << "Count of " << target << " is: " << count << endl;
powrót 0;

Wyjście:

Liczba 11 to: 2

Wyjaśnienie:
Podejście tabeli skrótów do zliczania występowania jest wdrażane przez funkcję craincurrenceshash (). Tworzy częstotliwość Unorderred_Map i ustawia swój stan początkowy na pustą mapę. Funkcja następnie aktualizuje liczbę każdej wartości danych na mapie częstotliwości podczas iteracji za pośrednictwem połączonej listy. Następnie zwracana jest liczba wartości docelowej na mapie częstotliwości.

Następnie funkcja deklaruje wskaźnik o nazwie „Bieżący” i inicjuje go do głowicy powiązanej listy. Tak długo, jak „prąd” nie jest zerowy, pętla white jest dodawana do funkcji. Funkcja ustawia „prąd” na bieżącą-> obok przejścia do następnego węzła na połączonej liście po zwiększeniu liczby danych prądowych na mapie częstotliwości dla każdej iteracji pętli.

Następnie funkcja zwraca liczbę wartości docelowej na mapie częstotliwości, która jest równa liczbie razy, gdy wartość docelowa pojawia się na połączonej liście, po zakończeniu pętli While.

Główna funkcja tworzy trzy obiekty węzłów, z których każdy reprezentuje węzeł na połączonej liście. Pierwszy węzeł jest przypisany do wartości 11, a jego następny wskaźnik jest ustawiony na wskazanie drugiego węzła. Podobnie drugi węzeł jest przypisany do wartości 12, a jego następny wskaźnik jest ustawiony na wskazanie trzeciego węzła. Trzeci węzeł jest przypisany do wartości 11, a jego następny wskaźnik jest ustawiony na NULL, aby wskazać koniec listy połączonej.

Następnie szef linkowanej listy i wartość docelowa są przekazywane jako parametry podczas wywoływania crowcCurrenceShash () w celu pobrania liczby wartości 11. Wyjście jest następnie drukowane do konsoli.

Wniosek

Iteracyjna, tabela skrótów i rekurencja to trzy najpopularniejsze sposoby liczenia przypadków określonej wartości na powiązanej liście w C++. W podejściu iteracyjnym lista połączona jest zapętlona, ​​a zmienna zliczania jest zwiększana za każdym razem, gdy wykryto węzeł, który zawiera pożądaną wartość. Częstotliwość elementów na połączonej liście jest przechowywana jako pary wartości kluczowej przy użyciu techniki tabeli skrótów, która wykorzystuje nieorządkowaną strukturę danych mapy. Metoda tabeli skrótów jest odpowiednia dla większych powiązanych list i oferuje szybkie prędkości wyszukiwania. Metoda rekurencji obejmuje wielokrotne wywoływanie funkcji w każdym węźle na połączonej liście, aby podzielić problem na mniejsze podprobaty. Po osiągnięciu końca listy połączonej, zwracana jest liczba zebrana na wszystkich połączeniach z funkcją.