Sobes.tech
Middle

Co je levnější: setřídit pole a pak hledat, nebo použít průchod k nalezení prvku?

sobes.tech AI

Odpověď od AI

Záleží na kontextu.

  1. Jednotlivé hledání v nenavřazeném poli:

    • Seřadit: Složitost řazení je obvykle $O(n \log n)$ nebo $O(n^2)$ (závisí na algoritmu).
    • Hledání (binární po seřazení): $O(\log n)$.
    • Celkem: $O(n \log n)$ nebo $O(n^2)$.
    • Lineární průchod (sekvenční hledání): $O(n)$.
    • Celkem: $O(n)$.
    • V tomto případě je průchod ($O(n)$) levnější než řazení + hledání ($O(n \log n)$ nebo horší).
  2. Vícenásobné hledání ve stejném poli:

    • Pokud je třeba provést $k$ hledání ve stejném poli.
    • Jednou seřadit: $O(n \log n)$ nebo $O(n^2)$.
    • Provést $k$ binárních hledání po seřazení: $k \times O(\log n) = O(k \log n)$.
    • Celkem: $O(n \log n + k \log n)$ nebo $O(n^2 + k \log n)$.
    • Provést $k$ lineárních průchodů: $k \times O(n) = O(kn)$.
    • Celkem: $O(kn)$.
    • Pro velká $k$ ($k > \log n$) je levnější řazení s binárním hledáním: $O(n \log n + k \log n)$ vs. $O(kn)$.
  3. Zvláštní případy:

    • Pokud je pole již částečně seřazené nebo má speciální strukturu, existují rychlejší algoritmy řazení nebo hledání.
    • Hash tabulky (Set nebo Hash v Ruby) nabízejí průměrně $O(1)$ čas pro hledání, což je obvykle rychlejší než jakákoli metoda založená na řazení nebo lineárním hledání.

Závěr: Pro jedno hledání je levnější průchod. Pro vícenásobná hledání ve stejném poli je efektivnější řazení s binárním hledáním, pokud je počet hledání dostatečně velký. Pokud je rychlost hledání kritická a datová struktura může být změněna, použití Set nebo Hash je nejoptimálnější řešení.

Příklad lineárního hledání v Ruby:

# Hledání prvku v nenavřazeném poli
array = [5, 2, 8, 1, 9, 4]
target = 8

found = nil
array.each do |element|
  if element == target
    found = element
    break # Ukončit po nalezení prvního shody
  end
end

puts found # => 8

Příklad řazení a binárního hledání v Ruby (s použitím standardních metod):

# Řazení
array = [5, 2, 8, 1, 9, 4]
sorted_array = array.sort # O(n \log n) v Ruby s Timsort

# Binární hledání (Ruby má 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 "Prvek nebyl nalezen"
end