🔍 جستجوی خطی (Linear) و جستجوی دودویی (Binary) در پایتون
📌 جستجوی خطی (Linear Search)
✅ سادهترین روش جستجو: تک تک عناصر آرایه را از اول تا آخر چک میکنیم تا مقدار مورد نظر را پیدا کنیم.
➕ مزایا: نیازی به مرتب بودن داده ندارد، برای هر لیستی کار میکند.
➖ معایب: اگر آرایه بزرگ باشد، کند است (بیشترین زمان در بدترین حالت).
💡 مانند گشتن برگههای یک کتاب به ترتیب صفحه به صفحه.
⚡ جستجوی دودویی (Binary Search)
✅ بسیار سریع! آرایه باید حتماً مرتب شده باشد. هر بار لیست را نصف میکنیم و مقدار میانی را مقایسه میکنیم.
➕ مزایا: برای دادههای بزرگ خیلی سریع (log n) است.
➖ معایب: فقط برای لیستهای مرتب شده کار میکند.
💡類似 جستجوی کلمه در فرهنگ لغت: نیمنگاه میکنی و محدوده را کوچک میکنی.
پروژه ۱: پیدا کردن عدد مخفی (جستجوی خطی ساده)
📖 سوال پروژه
یک لیست از اعداد ۱ تا ۲۰ بسازید. کاربر یک عدد وارد میکند، برنامه با جستجوی خطی بگوید که آیا عدد در لیست هست یا خیر و ایندکس آن را نمایش دهد.
🖥️ خروجی نمونه
عدد مورد نظر: ۱۵
✅ پیدا شد در اندیس ۱۴
عدد: ۲۵ ❌ پیدا نشد
🐍 حل پروژه
# جستجوی خطی - پروژه ۱
numbers = list(range(1, 21)) # 1 تا ۲۰
target = int(input("یک عدد بین ۱ تا ۲۰ وارد کن: "))
found_index = -1
for i in range(len(numbers)):
if numbers[i] == target:
found_index = i
break
if found_index != -1:
print(f"✅ عدد {target} در اندیس {found_index} پیدا شد.")
else:
print("❌ عدد در لیست وجود ندارد.")
پروژه ۲: فرهنگ اعداد (جستجوی دودویی)
📖 سوال پروژه
یک آرایه مرتب از ۵۰ عدد تصادفی (مرتب شده) بسازید. از کاربر عددی بگیرید و با الگوریتم جستجوی دودویی پیدا کنید و تعداد گامهای جستجو را نمایش دهید.
🖥️ خروجی نمونه
عدد: ۱۲ -> پیدا شد در اندیس ۳، تعداد گام: ۲
🐍 حل پروژه
import random
arr = sorted(random.sample(range(10,200), 50))
print("آرایه مرتب:", arr[:10], "...")
target = int(input("عدد مورد نظر: "))
low, high = 0, len(arr)-1
steps = 0
found = False
while low <= high:
steps += 1
mid = (low + high) // 2
if arr[mid] == target:
print(f"🔍 پیدا شد در اندیس {mid} بعد از {steps} گام")
found = True
break
elif arr[mid] < target:
low = mid + 1
else:
high = mid - 1
if not found:
print(f"❌ پیدا نشد. {steps} گام جستجو.")
پروژه ۳: غیاب و حضور (جستجوی خطی اسم)
📖 سوال پروژه
لیستی از ۱۰ نام دانش آموز داریم. کاربر یک نام وارد کند، با جستجوی خطی بگوید در کدام ردیف (ایندکس) قرار دارد، یا اخطار غایب.
🖥️ خروجی نمونه
نام: زهرا -> زهرا در اندیس ۲ حضور دارد.
🐍 حل پروژه
students = ["سارا", "امیر", "زهرا", "محمد", "نازنین", "علیرضا", "فاطمه", "حسین", "نگار", "کیان"]
name = input("نام دانش آموز: ")
pos = -1
for idx, student in enumerate(students):
if student == name:
pos = idx
break
if pos != -1:
print(f"✅ {name} در اندیس {pos} کلاس حضور دارد.")
else:
print(f"❌ {name} در لیست کلاس نیست.")
پروژه ۴: امتیاز قهرمانی (دودویی)
📖 سوال پروژه
لیست مرتبی از امتیازات بازیکنان (۲۰ نمره) داریم. کاربر یک امتیاز بدهد، جستجوی دودویی انجام دهد و بگوید چندمین بازیکن این امتیاز را دارد (بر اساس رتبه).
🖥️ خروجی نمونه
امتیاز: ۱۵۰۰ -> رتبه ۲ (اندیس ۲)
🐍 حل پروژه
scores = [1100, 1250, 1370, 1490, 1550, 1680, 1720, 1890, 2000, 2150, 2300, 2450]
target = int(input("امتیاز مورد نظر: "))
low, high = 0, len(scores)-1
index = -1
while low <= high:
mid = (low+high)//2
if scores[mid] == target:
index = mid
break
elif scores[mid] < target:
low = mid+1
else:
high = mid-1
if index != -1:
print(f"🏆 این امتیاز در رتبه {index+1} (اندیس {index}) قرار دارد.")
else:
print("امتیاز یافت نشد")
پروژه ۵: تکرار کلمات (خطی و شمارش)
📖 سوال پروژه
یک لیست از کلمات (مثل میوهها) که ممکن است تکراری باشند، کاربر یک کلمه بدهد، برنامه با جستجوی خطی تعداد دفعات تکرارش را بشمارد.
🖥️ خروجی نمونه
کلمه: سیب -> تعداد تکرار: ۳
🐍 حل پروژه
fruits = ["سیب","موز","سیب","پرتقال","انگور","سیب","کیوی","موز","سیب"]
word = input("کلمه مورد نظر: ")
count = 0
for item in fruits:
if item == word:
count += 1
print(f"🔁 کلمه '{word}' {count} بار تکرار شده است.")
پروژه ۶: الفبای رمز (جستجوی دودویی کاراکتر)
📖 سوال پروژه
لیست مرتبی از حروف انگلیسی (a-z) بسازید. کاربر یک حرف وارد کند، با جستجوی دودویی پیدا کنید و بگویید اندیس آن چند است.
🖥️ خروجی نمونه
حرف: m -> اندیس ۱۲
🐍 حل پروژه
import string
letters = list(string.ascii_lowercase) # لیست حروف a-z
ch = input("یک حرف انگلیسی کوچک وارد کن: ").lower()
low, high = 0, len(letters)-1
res = -1
while low <= high:
mid = (low+high)//2
if letters[mid] == ch:
res = mid
break
elif letters[mid] < ch:
low = mid+1
else:
high = mid-1
if res != -1:
print(f"حرف '{ch}' در اندیس {res} قرار دارد.")
else:
print("پیدا نشد")
پروژه ۷: مسابقه سرعت! خطی در برابر دودویی
📖 سوال پروژه
یک لیست مرتب ۱۰۰۰۰ تایی بسازید. یک مقدار را هم با خطی و هم با دودویی جستجو کنید و زمان اجرای هر دو را مقایسه کنید.
🖥️ خروجی نمونه
زمان جستجوی دودویی: ۰٫۰۰۰۰۱۲ ثانیه
دودویی خیلی سریعتر!
🐍 حل پروژه
import time
big_list = list(range(100000)) # 0 تا ۹۹۹۹۹
target = 98765
# خطی
start = time.time()
found_lin = target in big_list # داخلی اما مشابه خطی
end = time.time()
print(f"جستجوی خطی: {(end-start)*1000:.5f} میلیثانیه")
# دودویی
start = time.time()
low, high = 0, len(big_list)-1
found_bin = False
while low <= high:
mid = (low+high)//2
if big_list[mid] == target:
found_bin = True
break
elif big_list[mid] < target:
low = mid+1
else:
high = mid-1
end = time.time()
print(f"جستجوی دودویی: {(end-start)*1000:.5f} میلیثانیه")
پروژه ۸: جعبه فیلم (جستجوی خطی عناوین)
📖 سوال پروژه
لیستی از ۸ عنوان فیلم محبوب نوجوانان داریم. کاربر عنوانی بدهد، برنامه جستجوی خطی انجام داده و بگوید در چه جایگاهی (شماره ۱ تا ۸) قرار دارد.
🖥️ خروجی نمونه
فیلم: ونوم -> رتبه ۳
🐍 حل پروژه
movies = ["هری پاتر", "ارباب حلقه ها", "ونوم", "تایتانیک", "اینترنت پدر", "رئونیون", "تام و جری", "سونیک"]
search = input("نام فیلم: ")
found = False
for i, movie in enumerate(movies):
if movie == search:
print(f"🎬 فیلم «{search}» در جایگاه {i+1} (اندیس {i}) قرار دارد.")
found = True
break
if not found:
print("فیلم در فهرست نیست")
پروژه ۱۰: پیدا کردن یار همیشگی (خطی و دودویی روی لیست دوستان)
📖 سوال پروژه
لیست دوستان (اسامی) را مرتب کرده و هم با جستجوی خطی و هم دودویی یک اسم خاص را جستجو کن. در نهایت بگو هر دو روش جواب یکسان میدهند.
🖥️ خروجی نمونه
نام: سارا -> خطی اندیس ۳, دودویی اندیس ۳
🐍 حل پروژه
friends = ["سارا", "احسان", "مریم", "نوید", "لیلا"]
friends_sorted = sorted(friends)
print("لیست مرتب شده:", friends_sorted)
target = input("اسم دوست خود را بگو: ")
# جستجوی خطی روی لیست اصلی (غیرمرتب)
linear_idx = -1
for i, name in enumerate(friends):
if name == target:
linear_idx = i
break
# جستجوی دودویی روی لیست مرتب
low, high = 0, len(friends_sorted)-1
binary_idx = -1
while low <= high:
mid = (low+high)//2
if friends_sorted[mid] == target:
binary_idx = mid
break
elif friends_sorted[mid] < target:
low = mid+1
else:
high = mid-1
if linear_idx != -1:
print(f"جستجوی خطی: {target} در اندیس {linear_idx} لیست اصلی")
print(f"جستجوی دودویی (مرتب): در اندیس {binary_idx} از لیست مرتب")
else:
print("دوست مورد نظر یافت نشد")
