Sobes.tech
Middle

Čo je lacnejšie: zoradiť pole a potom hľadať, alebo použiť prehľadávanie na nájdenie prvku?

sobes.tech AI

Odpoveď od AI

Závisí od kontextu.

  1. Jednorazové vyhľadávanie v nezořadenom poli:

    • Zoradiť: Časová zložitosť zoradenia je zvyčajne $O(n \log n)$ alebo $O(n^2)$ (závisí od algoritmu).
    • Vyhľadávanie (binárne po zoradení): $O(\log n)$.
    • Celkovo: $O(n \log n)$ alebo $O(n^2)$.
    • Prehľadávanie (lineárne vyhľadávanie): $O(n)$.
    • Celkovo: $O(n)$.
    • V tomto prípade je prehľadávanie ($O(n)$) lacnejšie ako zoradenie + vyhľadávanie ($O(n \log n)$ alebo viac).
  2. Viackrát vyhľadávanie v poli:

    • Ak je potrebné vykonať $k$ vyhľadávaní v rovnakom poli.
    • Raz zoradiť: $O(n \log n)$ alebo $O(n^2)$.
    • Vykonať $k$ binárnych vyhľadávaní po zoradení: $k \times O(\log n) = O(k \log n)$.
    • Celkovo: $O(n \log n + k \log n)$ alebo $O(n^2 + k \log n)$.
    • Vykonať $k$ lineárnych vyhľadávaní: $k \times O(n) = O(kn)$.
    • Celkovo: $O(kn)$.
    • Pre veľké $k$ ($k > \log n$) sa zoradenie s následným binárnym vyhľadávaním stáva lacnejším: $O(n \log n + k \log n)$ verzus $O(kn)$.
  3. Špeciálne prípady:

    • Ak je pole už čiastočne zoradené alebo má špeciálnu štruktúru, existujú rýchlejšie algoritmy zoradenia alebo vyhľadávania.
    • Hash tabuľky (Set alebo Hash v Ruby) poskytujú priemerný čas $O(1)$ na vyhľadávanie, čo je zvyčajne rýchlejšie ako akákoľvek metóda založená na zoradení alebo lineárnom vyhľadávaní.

Záver: Pre jednoduché vyhľadávanie je lacnejšie prehľadávanie. Pre viackrát vyhľadávanie v tom istom poli sa zoradenie s binárnym vyhľadávaním stáva výhodnejším pri dostatočne veľkom počte vyhľadávaní. Ak je rýchlosť vyhľadávania dôležitá a štruktúra dát môže byť zmenená, použitie Set alebo Hash môže byť najoptimálnejším riešením.

Príklad lineárneho vyhľadávania v Ruby:

# Vyhľadávanie prvku v nezořadenom poli
array = [5, 2, 8, 1, 9, 4]
target = 8

found = nil
array.each do |element|
  if element == target
    found = element
    break # Zastavenie po nájdení prvého zhody
  end
end

puts found # => 8

Príklad zoradenia a binárneho vyhľadávania v Ruby (s použitím štandardných metód):

# Zoradenie
array = [5, 2, 8, 1, 9, 4]
sorted_array = array.sort # $O(n \log n)$ pre Timsort v Ruby

# Binárne vyhľadávanie (Ruby má vstavaný 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 "Prvok nie je nájdený"
end