rauay

Başarılı
Katılım
24 Aralık 2023
Mesajlar
657
Beğeniler
72
Arkadaşlar, merhaba! Şunu cevaplayabilecek biri var mı? Bilen insanlardan ben yeni yeni yapmaya başladım, az da olsa başladım ama bunda biraz zorlandım. Yardımcı olursanız çok mutlu olurum.

Sıralı bir listede örneğin: [3, 24, 25, 34, 41, 44, 53, 67]. Klavyeden girilen bir değeri en hızlı nasıl bulunur?
 
Son düzenleyen: Moderatör:
İstediğinizi pek anlayamadım. Biraz daha açıklamaya çalışır mısınız?

Şöyle bir şey mi istiyorsunuz?

[CODE lang="python" highlight="1, 15, 19-21"]def binary_search(arr, x): # binary_search adında bir fonksiyon tanımlıyoruz, parametre olarak bir dizi (arr) ve aranacak değer (x) alıyor.
low = 0 # Listenin başlangıç girdisi bu.
high = len(arr) - 1 # Bu da, listenin son girdisi.
while low <= high: # Girdiler arasında döngü başlatıyoruz, arama aralığı daraltıldıkça devam edecek.
mid = (low + high) // 2 # Arama aralığını ortadan ikiye bölüyoruz.
if arr[mid] == x: # Orta eleman hedef değere eşitse, aranan değeri bulduk, orta elemanın indisini döndürüyoruz.
return mid
elif arr[mid] < x: # Orta eleman hedef değerden küçükse, arama aralığını sağ tarafa kaydırıyoruz.
low = mid + 1
else: # Orta eleman hedef değerden büyükse, arama aralığını sol tarafa kaydırıyoruz.
high = mid - 1
return -1 # Değer bulunamadıysa -1 döndürüyoruz.

# Kullanım örneği de bu şekilde oluyor.
arr = [3, 24, 25, 34, 41, 44, 53, 67] # Kendine göre gir listeyi.
x = int(input("Aranan değeri girin: ")) # Burada, aranmasını istediğin değeri gireceksin.
result = binary_search(arr, x) # Arama fonksiyonuyla aramayı yapıyor.
if result != -1: # Girdiğin değeri var mı, yok mu diye kontrol ediyor.
print("Değer", result, "konumunda bulundu.")
else:
print("Değer bulunamadı.")


[/CODE]
 
Son düzenleyen: Moderatör:
Artı -1 Eksi
@Silinen üye 1 adet for döngüsü yetmez miydi yav? :) Liste uzunluğu kadar dönecek, her dönüşte sırasıyla liste elemanını inputla kıyaslayacak falan…

Aslında verilen liste de okunacağı için her türlü en az liste uzunluğu kadar işlem yapılacak, dolayısıyla binary search pek etkili olmuş olmayacak ancak konu sahibinin şu isteği önemli:
Klavyeden girilen bir değer en hızlı nasıl bulunur?

Binary search, bir adet sayı yerine özellikle birden fazla sayı tek tek bulunmak istendiğinde işe yarardı. log(liste uzunluğu) hızında çalışıyor.

Tabii binary search'ün uygulanabilirliği, listenin sıralı olmasını gerektiriyor.

Binary search'ün hazır hâli var, onu kullanmayı da tercih edebilirsiniz:
Python:
from bisect import bisect_left

array = map(int, input().split())
# array kesin sıralı.
aranan = int(input())

yer = bisect_left(array, aranan)

if yer != len(array) and array[yer] == aranan:
  print(yer)
else:
  print("Bulunamadı.")

bisect_right diye bir metot daha var, en sağdakini bulur.
 
Son düzenleme:
Aslında verilen liste de okunacağı için her türlü en az liste uzunluğu kadar işlem yapılacak, dolayısıyla binary Search pek etkili olmuş olmayacak ancak konu sahibinin şu isteği önemli:

Binary Search, bir adet sayı yerine özellikle birden fazla sayı tek tek bulunmak istendiğinde işe yarardı. log(liste uzunluğu) hızında çalışıyor.

Tabii binary Search'ün uygulanabilirliği, listenin sıralı olmasını gerektiriyor.

Binary Search'ün hazır hâli var, onu kullanmayı da tercih edebilirsiniz:
Python:
from bisect import bisect_left

array = map(int, input().split())
# array kesin sıralı.
aranan = int(input())

yer = bisect_left(array, aranan)

if yer != len(array) and array[yer] == aranan:
 print(yer)
else:
 print("Bulunamadı.")

bisect_right diye bir metot daha var, en sağdakini bulur.

Teşekkürler.
İstediğinizi pek anlayamadım. Biraz daha açıklamaya çalışır mısınız?

Şöyle bir şey mi istiyorsunuz?

[CODE lang="python" highlight="1, 15, 19-21"]def binary_search(arr, x): # binary_search adında bir fonksiyon tanımlıyoruz, parametre olarak bir dizi (arr) ve aranacak değer (x) alıyor.
low = 0 # Listenin başlangıç girdisi bu.
high = len(arr) - 1 # Bu da, listenin son girdisi.
while low <= high: # Girdiler arasında döngü başlatıyoruz, arama aralığı daraltıldıkça devam edecek.
mid = (low + high) // 2 # Arama aralığını ortadan ikiye bölüyoruz.
if arr[mid] == x: # Orta eleman hedef değere eşitse, aranan değeri bulduk, orta elemanın indisini döndürüyoruz.
return mid
elif arr[mid] < x: # Orta eleman hedef değerden küçükse, arama aralığını sağ tarafa kaydırıyoruz.
low = mid + 1
else: # Orta eleman hedef değerden büyükse, arama aralığını sol tarafa kaydırıyoruz.
high = mid - 1
return -1 # Değer bulunamadıysa -1 döndürüyoruz.

# Kullanım örneği de bu şekilde oluyor.
arr = [3, 24, 25, 34, 41, 44, 53, 67] # Kendine göre gir listeyi.
x = int(input("Aranan değeri girin: ")) # Burada, aranmasını istediğin değeri gireceksin.
result = binary_search(arr, x) # Arama fonksiyonuyla aramayı yapıyor.
if result != -1: # Girdiğin değeri var mı, yok mu diye kontrol ediyor.
print("Değer", result, "konumunda bulundu.")
else:
print("Değer bulunamadı.")

[/CODE]

Teşekkürler.
 
Son düzenleyen: Moderatör:
Binary search algoritmasının üzerinde durduğum şu içeriğe de göz atabilirsiniz: Rehber: İkili arama algoritması: Binary Search.

Ek Türkçe kaynak olarak şunu paylaşabilirim: İkili Arama Algoritması (Binary Search Algorithm) – Bilgisayar Kavramları.

İngilizce kaynak olarak da şunlar olabilir:
Algoritmayı iyice anlayabilmek isterseniz işinize yarayacaktır bu kaynaklar.