Sobes.tech
Middle

Co jest tańsze: posortować tablicę i potem wyszukać, czy użyć przeszukiwania liniowego, aby znaleźć element?

sobes.tech AI

Odpowiedź od AI

To zależy od kontekstu.

  1. Pojedyncze wyszukiwanie w nieposortowanej tablicy:

    • Posortować: Złożoność sortowania to zazwyczaj $O(n \log n)$ lub $O(n^2)$ (w zależności od algorytmu).
    • Wyszukiwanie (binarne po sortowaniu): $O(\log n)$.
    • Razem: $O(n \log n)$ lub $O(n^2)$.
    • Przeszukiwanie liniowe (przeglądanie): $O(n)$.
    • Razem: $O(n)$.
    • W tym przypadku przeszukiwanie ($O(n)$) jest tańsze niż sortowanie + wyszukiwanie ($O(n \log n)$ lub więcej).
  2. Wielokrotne wyszukiwania w tablicy:

    • Jeśli trzeba wykonać $k$ wyszukiwań w tym samym arrayu.
    • Posortować raz: $O(n \log n)$ lub $O(n^2)$.
    • Wykonać $k$ wyszukiwań binarnych po sortowaniu: $k \times O(\log n) = O(k \log n)$.
    • Razem: $O(n \log n + k \log n)$ lub $O(n^2 + k \log n)$.
    • Wykonać $k$ przeszukiwań liniowych: $k \times O(n) = O(kn)$.
    • Razem: $O(kn)$.
    • Dla dużych $k$ ($k > \log n$), sortowanie z wyszukiwaniem binarnym staje się tańsze: $O(n \log n + k \log n)$ vs $O(kn)$.
  3. Szczególne przypadki:

    • Jeśli array jest już częściowo posortowany lub ma specjalną strukturę, istnieją szybsze algorytmy sortowania lub wyszukiwania.
    • Tablice haszujące (Set lub Hash w Ruby) oferują średnio $O(1)$ czas wyszukiwania, co jest zwykle szybsze niż jakakolwiek metoda oparta na sortowaniu lub liniowym przeszukiwaniu.

Wniosek: Dla pojedynczego wyszukiwania przeszukiwanie jest tańsze. Dla wielu wyszukiwań w tym samym arrayu, sortowanie z wyszukiwaniem binarnym staje się bardziej opłacalne przy wystarczającej liczbie wyszukiwań. Jeśli szybkość wyszukiwania jest kluczowa, a struktura danych może być zmieniona, użycie Set lub Hash może być najbardziej optymalne.

Przykład liniowego wyszukiwania w Ruby:

# Wyszukiwanie elementu w nieposortowanej tablicy
array = [5, 2, 8, 1, 9, 4]
target = 8

found = nil
array.each do |element|
  if element == target
    found = element
    break # Zatrzymanie po znalezieniu pierwszego dopasowania
  end
end

puts found # => 8

Przykład sortowania i wyszukiwania binarnego w Ruby (z użyciem standardowych metod):

# Sortowanie
array = [5, 2, 8, 1, 9, 4]
sorted_array = array.sort # O(n \log n) dla Timsort w Ruby

# Wyszukiwanie binarne (Ruby ma bsearch)
target = 8
index = sorted_array.bsearch_index { |x| x >= target } # O(\log n)

if index && sorted_array[index] == target
  puts sorted_array[index] # => 8
else
  puts "Element nie znaleziony"
end