البحث الخطي
آخر تحديث
البحث الخطي (ويسمى أيضًا البحث التسلسلي) هو أبسط خوارزمية بحث: ابدأ من العنصر الأول وقارن كل عنصر بالقيمة المستهدفة حتى تجد تطابقًا أو تنفد العناصر. لا يفترض شيئًا عن البيانات — يمكن أن تكون المصفوفة غير مرتبة، ويمكن أن تكون العناصر أي شيء قابل للمقارنة بالتساوي.
تُبرز الرسوم المتحركة أعلاه كل مقارنة بينما يتحرك المسح من اليسار إلى اليمين، وتتوقف لحظة ظهور الهدف. بساطته تكلفه السرعة: في أسوأ الحالات يُفحص كل عنصر، لذا يعمل في O(n). عندما تكون البيانات مرتبة، يعثر البحث الثنائي على الإجابة نفسها في O(log n) — وإذا احتجت إلى بيانات مرتبة أولًا، فانظر الترتيب بالدمج.
التعقيد الزمني والمكاني
| الحالة | التعقيد | ملاحظات |
|---|---|---|
| أفضل حالة | O(1) | العنصر الأول هو الهدف. |
| الحالة المتوسطة | O(n) | في المتوسط يُفحص نصف العناصر قبل العثور على الهدف. |
| أسوأ حالة | O(n) | الهدف في النهاية — أو غير موجود أصلًا. |
| المساحة | O(1) | يُحتفظ فقط بالمؤشر الحالي. |
خطوة بخطوة
| الخطوة | ما الذي يحدث |
|---|---|
| 1 | ابدأ عند المؤشر 0، أول عنصر في المصفوفة. |
| 2 | قارن العنصر الحالي بالقيمة المستهدفة. |
| 3 | إذا تساويا، أعد المؤشر الحالي — تم العثور عليه. |
| 4 | وإلا فانتقل موضعًا واحدًا إلى اليمين وكرر. |
| 5 | إذا وصلت إلى نهاية المصفوفة دون تطابق، فالهدف غير موجود (أعد -1). |
مثال محلول
البحث عن 5 في [7, 3, 9, 1, 5, 8, 2]:
| المقارنة | المؤشر | العنصر | النتيجة |
|---|---|---|---|
| 1 | 0 | 7 | 7 ≠ 5 — تابع المسح. |
| 2 | 1 | 3 | 3 ≠ 5 — تابع المسح. |
| 3 | 2 | 9 | 9 ≠ 5 — تابع المسح. |
| 4 | 3 | 1 | 1 ≠ 5 — تابع المسح. |
| 5 | 4 | 5 | 5 = 5 — تم العثور عليه عند المؤشر 4. |
متى تستخدم البحث الخطي
| استخدمه عندما | تجنبه عندما |
|---|---|
| تكون البيانات غير مرتبة أو تتغير باستمرار | تكون البيانات مرتبة — البحث الثنائي أسرع أُسّيًا |
| تكون المجموعة صغيرة، فالبساطة تفوز | تكون مجموعة البيانات كبيرة ويُبحث فيها مرارًا |
| لا تملك سوى وصول تسلسلي (التدفقات، القوائم المتصلة) | يمكنك تحمّل كلفة فهرس أو جدول تجزئة لعمليات بحث في O(1) |
كود Linear Search
تنفيذ نظيف وقابل للتشغيل لخوارزمية Linear Search بلغات Python, JavaScript, Java, C++, C, Pseudocode. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.
كود Linear Search بلغة Python
1def linear_search(a, target):2 # Scan left to right until the target appears3 for i in range(len(a)):4 if a[i] == target:5 return i6 return -17
8
9nums = [7, 3, 9, 1, 5, 8, 2]10print("Index of 5:", linear_search(nums, 5))11print("Index of 4:", linear_search(nums, 4))كود Linear Search بلغة JavaScript
1function linearSearch(a, target) {2 // Scan left to right until the target appears3 for (let i = 0; i < a.length; i++) {4 if (a[i] === target) return i;5 }6 return -1;7}8
9const nums = [7, 3, 9, 1, 5, 8, 2];10console.log("Index of 5:", linearSearch(nums, 5));11console.log("Index of 4:", linearSearch(nums, 4));كود Linear Search بلغة Java
1public class Main {2 static int linearSearch(int[] a, int target) {3 // Scan left to right until the target appears4 for (int i = 0; i < a.length; i++) {5 if (a[i] == target) return i;6 }7 return -1;8 }9
10 public static void main(String[] args) {11 int[] nums = {7, 3, 9, 1, 5, 8, 2};12 System.out.println("Index of 5: " + linearSearch(nums, 5));13 System.out.println("Index of 4: " + linearSearch(nums, 4));14 }15}كود Linear Search بلغة C++
1#include <iostream>2#include <vector>3
4int linearSearch(const std::vector<int>& a, int target) {5 // Scan left to right until the target appears6 for (std::size_t i = 0; i < a.size(); i++) {7 if (a[i] == target) return static_cast<int>(i);8 }9 return -1;10}11
12int main() {13 std::vector<int> nums = {7, 3, 9, 1, 5, 8, 2};14 std::cout << "Index of 5: " << linearSearch(nums, 5) << "\n";15 std::cout << "Index of 4: " << linearSearch(nums, 4) << "\n";16 return 0;17}كود Linear Search بلغة C
1#include <stdio.h>2
3int linear_search(const int a[], int n, int target) {4 /* Scan left to right until the target appears */5 for (int i = 0; i < n; i++) {6 if (a[i] == target) return i;7 }8 return -1;9}10
11int main(void) {12 int nums[] = {7, 3, 9, 1, 5, 8, 2};13 int n = sizeof(nums) / sizeof(nums[0]);14 printf("Index of 5: %d\n", linear_search(nums, n, 5));15 printf("Index of 4: %d\n", linear_search(nums, n, 4));16 return 0;17}كود Linear Search بلغة Pseudocode
1DECLARE nums : ARRAY[1:7] OF INTEGER2DECLARE n : INTEGER3n ← 74nums[1] ← 75nums[2] ← 36nums[3] ← 97nums[4] ← 18nums[5] ← 59nums[6] ← 810nums[7] ← 211
12FUNCTION linearSearch(target : INTEGER) RETURNS INTEGER13 DECLARE i : INTEGER14 // Scan left to right until the target appears15 FOR i ← 1 TO n16 IF nums[i] = target THEN17 RETURN i18 ENDIF19 NEXT i20 RETURN -121ENDFUNCTION22
23OUTPUT "Index of 5 is ", linearSearch(5)24OUTPUT "Index of 4 is ", linearSearch(4)الأسئلة الشائعة عن البحث الخطي
ما التعقيد الزمني للبحث الخطي؟
O(n) في الحالتين المتوسطة والأسوأ — فقد يضطر المسح إلى زيارة كل عنصر — وO(1) في أفضل حالة عندما يكون العنصر الأول هو الهدف. يستخدم مساحة إضافية O(1).هل يحتاج البحث الخطي إلى بيانات مرتبة؟
متى يكون البحث الخطي أفضل من البحث الثنائي؟
O(n log n))، أو عندما تكون المجموعة صغيرة جدًا، أو عندما لا تملك سوى وصول تسلسلي مثل تدفق أو قائمة متصلة. أما لعمليات البحث المتكررة في المصفوفات المرتبة، فيفوز البحث الثنائي.هل البحث الخطي هو نفسه البحث التسلسلي؟
كم عدد المقارنات التي يجريها البحث الخطي في المتوسط؟
n/2 مقارنة في المتوسط؛ وإذا كان الهدف غائبًا فبالضبط n. هذا النمو الخطي هو سبب تسميته بالبحث الخطي.