Saturday 16 December 2017

Przeprowadzka średnia geeksforgeeks


Podobnie jak sortowanie scalone. QuickSort to algorytm Divide and Conquer. Pobiera element jako oś obrotu i dzieli podaną tablicę wokół wybranego obrysu. Istnieje wiele różnych wersji quickSort, które wybierają pivot na różne sposoby. Zawsze wybieraj pierwszy element jako oś obrotu. Zawsze wybieraj ostatni element jako oś obrotu (zaimplementowany poniżej) Wybierz losowy element jako oś obrotu. Wybierz medianę jako oś obrotu. Kluczowym procesem w quickSort jest partycja (). Celem partycji jest, biorąc pod uwagę tablicę i element x tablicy jako oś obrotu, umieść x we ​​właściwej pozycji w posortowanej tablicy i umieść wszystkie mniejsze elementy (mniejsze niż x) przed x, i umieść wszystkie większe elementy (większe od x) po x. Wszystko to powinno się odbywać w czasie liniowym. Pseudo Code dla rekursywnej funkcji QuickSort: Partition Algorithm Istnieje wiele sposobów na wykonanie partycji, po pseudo-kodzie zastosowano metodę podaną w książce CLRS. Logika jest prosta, zaczynamy od skrajnego lewego elementu i śledzimy indeks mniejszych (lub równych) elementów jako i. Podczas przechodzenia, jeśli znajdziemy mniejszy element, zamieniamy bieżący element na przylot. W przeciwnym razie ignorujemy bieżący element. Pseudo-kod dla partycji () Ilustracja partycji (): Implementacja: Poniżej przedstawiono implementacje QuickSort w języku C, Java i Python. Analiza czasu QuickSort podjętego przez QuickSort w ogólności można zapisać w następujący sposób. Pierwsze dwa terminy dotyczą dwóch wywołań rekursywnych, ostatni termin dotyczy procesu partycji. k to liczba elementów, które są mniejsze niż oś obrotu. Czas potrzebny na QuickSort zależy od tablicy wejściowej i strategii partycji. Oto trzy przypadki. Najgorszy przypadek: Najgorszy przypadek występuje, gdy proces partycji zawsze wybiera największy lub najmniejszy element jako oś obrotu. Jeśli weźmiemy pod uwagę strategię partycji, w której ostatni element jest zawsze wybierany jako oś obrotu, najgorszy przypadek wystąpi, gdy tablica zostanie już posortowana w porządku rosnącym lub malejącym. Następuje nawrót w najgorszym przypadku. Najlepszy przypadek: Najlepszy przypadek występuje, gdy proces partycji zawsze wybiera środkowy element jako oś obrotu. Oto powtarzalność dla najlepszego przypadku. Średni przypadek: Aby wykonać analizę średniej sprawy, musimy wziąć pod uwagę całą możliwą permutację macierzy i obliczyć czas potrzebny dla każdej permutacji, która nie wygląda łatwo. Możemy poznać przeciętny przypadek rozpatrując przypadek, w którym partycja umieszcza elementy O (n9) w jednym zbiorze i elementy O (9n10) w innym zbiorze. Poniżej znajduje się wznowienie dla tego przypadku. Rozwiązanie powyższego powtarzania się jest również O (nLogn) Mimo że najgorszym przypadku złożoność QuickSorta to O (n 2), czyli więcej niż wiele innych algorytmów sortowania, takich jak Sortowanie scalone i Sortowanie sterty. QuickSort jest szybszy w praktyce, ponieważ jego wewnętrzna pętla może być wydajnie zaimplementowana na większości architekturach iw większości rzeczywistych danych. QuickSort można zaimplementować na różne sposoby, zmieniając wybór osi obrotu, tak że najgorszy przypadek rzadko występuje dla danego typu danych. Jednak sortowanie scalone jest ogólnie uważane za lepsze, gdy dane są ogromne i przechowywane w pamięci zewnętrznej. Co to jest 3-Way QuickSort W prostym algorytmie QuickSort, wybieramy element jako pivot, dzielimy tablicę wokół pivota i powtarzamy dla podmodeli po lewej i prawej stronie osi obrotu. Rozważmy tablicę, która ma wiele zbędnych elementów. Na przykład, . Jeśli w Simple QuickSort wybrano 4 jako oś obrotu, naprawiamy tylko jeden 4 i rekursywnie przetwarzamy pozostałe wystąpienia. W 3-Way QuickSort tablica arrl..r jest podzielona na 3 części: a) arrl..i elementy mniejsze niż oś obrotu. b) elementy arri1..j-1 równe czopowi. c) arrj..r elementy większe niż oś obrotu. Zobacz to do wdrożenia. Czy możemy Iteratywnie wdrożyć QuickSort? Tak, proszę zapoznać się z Iteratywnym Szybkim Sortowaniem. Dlaczego Quick Sort jest preferowany w porównaniu z MergeSort do sortowania tablic Szybkie sortowanie w swojej ogólnej formie jest sortowaniem w miejscu (tj. Nie wymaga dodatkowego przechowywania), podczas gdy sortowanie scalone wymaga dodatkowej pamięci O (N), N oznacza rozmiar tablicy, który może być dość drogi. Przydzielenie i cofnięcie przydzielenia dodatkowej przestrzeni używanej do sortowania korespondencji zwiększa czas działania algorytmu. Porównując średnią złożoność, stwierdziliśmy, że oba typy sortów mają średnią złożoność O (NlogN), ale stałe różnią się. W przypadku tablic scalaj straty sortowania ze względu na użycie dodatkowej przestrzeni pamięci O (N). Większość praktycznych implementacji szybkiego sortowania używa losowej wersji. Randomizowana wersja oczekiwała złożoności czasowej O (nLogn). Najgorszy przypadek jest możliwy również w wersji randomizowanej, ale najgorszy przypadek nie występuje w przypadku określonego wzorca (jak posortowana tablica), a losowy Quick Sort działa dobrze w praktyce. Szybkie sortowanie jest również przyjaznym dla pamięci podręcznej algorytmem sortowania, ponieważ ma dobrą lokalizację odniesienia, gdy jest używany do tablic. Szybkie sortowanie jest również rekurencyjne, dlatego przeprowadzane są optymalizacje wywołań końcowych. Dlaczego MergeSort jest preferowany w stosunku do QuickSort dla list połączonych W przypadku list z linkami przypadek różni się głównie z powodu różnicy w alokacji pamięci tablic i połączonych list. W przeciwieństwie do tablic połączonych węzłów listy mogą nie być sąsiadujące w pamięci. W przeciwieństwie do tablicy, na połączonej liście możemy wstawiać elementy w środku w O (1) dodatkowej przestrzeni i czasie O (1). Dlatego operacja scalania sortowania scalonego może zostać zaimplementowana bez dodatkowej przestrzeni dla połączonych list. W tablicach możemy uzyskać dostęp losowy, ponieważ elementy są ciągłe w pamięci. Powiedzmy, że mamy całkowitą (4-bajtową) tablicę A i niech adres A0 będzie x wtedy, aby uzyskać dostęp do Ai, możemy uzyskać bezpośredni dostęp do pamięci w (x i4). W przeciwieństwie do tablic, nie możemy zrobić losowego dostępu na liście połączonej. Szybkie sortowanie wymaga dużej ilości tego rodzaju dostępu. Na liście połączonej, aby uzyskać dostęp do indeksu, musimy przemieścić każdy węzeł od głowy do węzła ith, ponieważ nie mamy ciągłego bloku pamięci. Dlatego zwiększa się narzut w celu szybkiego sortowania. Scal sortuj dostęp do danych sekwencyjnie, a potrzeba dostępu losowego jest niska. Lista poleceń Lista 1 (Wprowadzenie) Czy możemy wyszukiwać w posortowanej liście połączonej w czasie lepszym niż czas O (n) Najgorszy przypadek wyszukiwania sortowanej listy połączonej to O ( n), ponieważ możemy tylko liniowo przemierzać listę i nie możemy pominąć węzłów podczas wyszukiwania. W przypadku zrównoważonego drzewa wyszukiwania binarnego pomijamy prawie połowę węzłów po jednym porównaniu z rootem. W przypadku sortowanej tablicy mamy dostęp losowy i możemy zastosować wyszukiwanie binarne na tablicach. Czy możemy rozszerzyć posortowane połączone listy, aby wyszukiwanie było szybsze? Odpowiedź brzmi: Lista przeskoków. Pomysł jest prosty, tworzymy wiele warstw, dzięki czemu możemy pominąć niektóre węzły. Zobacz poniższą przykładową listę z 16 węzłami i dwiema warstwami. Górna warstwa działa jako linia 8220express8221, która łączy tylko główne zewnętrzne stacje, a dolna warstwa działa jako 8220normalny pas 8221, który łączy każdą stację. Załóżmy, że chcemy wyszukać 50, zaczynamy od pierwszego węzła linii 8220express8221 i poruszamy się po linii 8220express8221, aż znajdziemy węzeł, którego następny jest większy niż 50. Po znalezieniu takiego węzła (30 jest węzłem w następującym przykładzie) Ścieżka 8220express8221, przenosimy się do 8220normalnego pasa 8221 za pomocą wskaźnika z tego węzła i liniowo szukamy 50 na 8220normalnym pasie 8221. W poniższym przykładzie zaczynamy od 30 na 8220normalnym pasie 8221 i przy wyszukiwaniu liniowym znajdujemy 50. Jaka jest złożoność czasu z dwiema warstwami Najgorsza złożoność czasu to liczba węzłów na linii 8220express8221 plus liczba węzłów w segmencie (segment jest liczbą 8220normalnych ścieżek 8221 węzłów między dwoma węzłami 8220express 8221) 8220normalnych linii 8221. Więc jeśli mamy n węzłów na 8220normalnych liniach 8221, radicn (pierwiastek kwadratowy z n) węzłach na linii 8220express8221 i równomiernie dzielimy 8220normalną ścieżkę 8221, to będą węzły radicn w każdym segmencie 8220normalnego pasa 8221. radicn to w rzeczywistości optymalny podział na dwie warstwy. Przy takim ustawieniu liczba węzłów przeszukiwanych dla wyszukiwania będzie wynosiła O (radicn). Dlatego dzięki O (radicn) dodatkowej przestrzeni jesteśmy w stanie zredukować złożoność czasu do O (radicn). Możemy zrobić lepiej Złożoność czasową list pomijania można jeszcze bardziej zmniejszyć, dodając kolejne warstwy. W rzeczywistości czas złożoności wyszukiwania, wstawiania i usuwania może w zwykłym przypadku być O (Logn). Wkrótce opublikujemy więcej postów na listach pomijania. Napisz komentarze, jeśli znajdziesz coś niepoprawnego lub chcesz udostępnić więcej informacji na temat omówiony powyżej. Pisanie kodu w komentarzu Proszę użyć code. geeksforgeeks. org. wygeneruj link i udostępnij link tutaj. Wczytuj komentarze Udostępnij ten postMedian z dwóch posortowanych tablic Pytanie: Istnieją 2 posortowane tablice A i B o rozmiarze n każdy. Napisz algorytm, aby znaleźć medianę tablicy uzyskanej po scaleniu powyższych 2 tablic (tj. Macierzy długości 2n). Złożoność powinna być równa O (log (n)). Zalecamy kliknięcie tutaj i przećwiczenie, zanim przejdziesz do rozwiązania. Mediana: w teorii prawdopodobieństwa i statystyce medianę określa się jako liczbę oddzielającą wyższą połowę próbki, populację lub rozkład prawdopodobieństwa od dolnej połowy. Medianę skończonej listy liczb można znaleźć, układając wszystkie liczby od najniższej wartości do najwyższej wartości i wybierając środkową. Aby uzyskać medianę tablicy wejściowej, najpierw posortuj tablicę. Dostajemy po sortowaniu. Mediana jest środkowym elementem posortowanej tablicy, która wynosi 12. Istnieją różne konwencje, aby wziąć medianę tablicy z parzystą liczbą elementów, można wziąć średnią dwóch środkowych wartości lub pierwszej średniej wartości lub drugiej średniej wartości. Zobaczmy różne metody, aby uzyskać medianę dwóch posortowanych tablic o rozmiarze n każdy. Ponieważ rozmiar zestawu, dla którego szukamy mediany jest równy (2n), bierzemy średnią dwóch środkowych liczb we wszystkich poniższych rozwiązaniach. Metoda 1 (po prostu licz się podczas łączenia) Użyj procedury scalania sortowania scalonego. Śledź liczbę podczas porównywania elementów z dwóch tablic. Jeśli count zostanie n (Dla elementów 2n), osiągnęliśmy medianę. Weź średnią elementów w indeksach n-1 in w połączonej tablicy. Zobacz poniższą implementację. Złożoność czasowa: O (n) Metoda 2 (Porównując median dwóch tablic) Ta metoda działa, najpierw pobierając mediany z dwóch posortowanych tablic, a następnie porównując je. Niech ar1 i ar2 będą tablicami wejściowymi. Dla powyższych dwóch tablic m1 15 i m2 17 Dla powyższych ar1 i ar2, m1 jest mniejsze niż m2. Mediana jest więc obecna w jednej z dwóch podmateriów. Powtórzmy proces dla powyższych dwóch pod-planów: m1 jest większe niż m2. Zatem subariesze stają się Złożonością czasu: O (logn) Algorytmiczny paradygmat: Podziel i zwyciężaj Proszę napisać komentarz, jeśli uważasz, że powyższe algorytmy kodów są nieprawidłowe lub znaleźć inne sposoby rozwiązania tego samego problemu.

No comments:

Post a Comment