Middle
Was ist günstiger: Ein Array sortieren und dann suchen, oder eine lineare Suche verwenden, um ein Element zu finden?
sobes.tech KI
Antwort von AI
Es hängt vom Kontext ab.
-
Einmalige Suche in einem ungeordneten Array:
- Sortieren: Die Sortierkomplexität ist in der Regel $O(n \log n)$ oder $O(n^2)$ (abhängig vom Algorithmus).
- Suche (binär nach dem Sortieren): $O(\log n)$.
- Insgesamt: $O(n \log n)$ oder $O(n^2)$.
- Durchlauf (lineare Suche): $O(n)$.
- Insgesamt: $O(n)$.
- In diesem Fall ist der Durchlauf ($O(n)$) günstiger als Sortieren + Suche ($O(n \log n)$ oder mehr).
-
Mehrfache Suche in einem Array:
- Wenn Sie $k$ Suchen im selben Array durchführen müssen.
- Einmal sortieren: $O(n \log n)$ oder $O(n^2)$.
- $k$ binäre Suchen nach dem Sortieren durchführen: $k \times O(\log n) = O(k \log n)$.
- Insgesamt: $O(n \log n + k \log n)$ oder $O(n^2 + k \log n)$.
- $k$ lineare Durchläufe durchführen: $k \times O(n) = O(kn)$.
- Insgesamt: $O(kn)$.
- Für große $k$ ($k > \log n$) wird das Sortieren mit anschließender binärer Suche günstiger: $O(n \log n + k \log n)$ gegenüber $O(kn)$.
-
Besondere Fälle:
- Wenn das Array bereits teilweise sortiert ist oder eine spezielle Struktur hat, gibt es schnellere Sortier- oder Suchalgorithmen.
- Hash-Tabellen (Set oder Hash in Ruby) bieten im Durchschnitt $O(1)$ Zeit für die Suche, was in der Regel schneller ist als jede Methode, die auf Sortieren oder linearer Suche basiert.
Fazit: Für einzelne Suchen ist das Durchsuchen günstiger. Für Mehrfachsuchen im selben Array ist Sortieren mit binärer Suche bei ausreichend vielen Suchen effizienter. Wenn die Suchgeschwindigkeit entscheidend ist und die Datenstruktur geändert werden kann, ist die Verwendung von Set oder Hash die optimale Lösung.
Beispiel für lineare Suche in Ruby:
# Suche nach einem Element in einem ungeordneten Array
array = [5, 2, 8, 1, 9, 4]
target = 8
found = nil
array.each do |element|
if element == target
found = element
break # Beenden nach erster Übereinstimmung
end
end
puts found # => 8
Beispiel für Sortieren und binäre Suche in Ruby (mit Standardmethoden):
# Sortieren
array = [5, 2, 8, 1, 9, 4]
sorted_array = array.sort # O(n \log n) für Timsort in Ruby
# Binäre Suche (Ruby hat 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 nicht gefunden"
end