logo

فرز الوقت الخطي

مقدمة

يعد الفرز عملية أساسية في علوم الكمبيوتر تتضمن ترتيب العناصر في ترتيب معين، مثل الترتيب العددي أو الأبجدي. وقد تم تطوير خوارزميات فرز مختلفة، ولكل منها مؤشرات الوقت والكفاءة. الفرز الزمني الخطي هو مجموعة فرعية من خوارزميات الفرز ذات ميزة كبيرة: يمكنها فرز مجموعة معينة من العناصر في وقت خطي، ويزداد وقت التشغيل خطيًا مع حجم الإدخال.

أشهر خوارزميات فرز الوقت الخطي هي الفرز التنازلي. يكون الفرز الحسابي فعالاً بشكل خاص عندما يكون نطاق عناصر الإدخال معروفًا وصغيرًا نسبيًا. وهذا يلغي الحاجة إلى مقارنة العناصر، وهي العملية الرئيسية التي تستغرق وقتًا طويلاً في العديد من خوارزميات الفرز الأخرى. باستخدام المعرفة بمجال الإدخال، يحقق الفرز الحسابي تعقيدًا زمنيًا خطيًا. يقوم الفرز الرقمي أولاً بفحص مصفوفة الإدخال لتحديد عدد كل عنصر. ثم يستخدم هذه الأرقام لحساب المواضع الصحيحة للعناصر في جدول النتائج المرتب. تتكون الخوارزمية من الخطوات التالية:

  1. لتحديد النطاق، حدد الحد الأدنى والحد الأقصى لقيم مصفوفة الإدخال.
  2. قم بإنشاء ورقة عمل تمت تهيئتها بحجم النطاق والأصفار.
  3. قم بالتكرار على مصفوفة الإدخال وقم بزيادة كل عنصر تم العثور عليه.
  4. قم بتعديل ورقة العمل عن طريق حساب المجموع التراكمي للحصول على المواضع الصحيحة لكل عنصر.
  5. قم بإنشاء مصفوفة إخراج بنفس حجم مصفوفة الإدخال.
  6. قم بتحريك مصفوفة الإدخال مرة أخرى، مع وضع كل عنصر في الموضع الصحيح في مصفوفة الإخراج بناءً على ورقة العمل.
  7. يحتوي جدول النتائج الآن على عناصر مرتبة.
فرز الوقت الخطي

الميزة الرئيسية للفرز التنازلي هي أنه يحقق تعقيدًا زمنيًا خطيًا قدره O(n)، مما يجعله فعالًا للغاية بالنسبة لأحجام المدخلات الكبيرة. ومع ذلك، فإن إمكانية تطبيقه تقتصر على السيناريوهات التي يكون فيها اختيار عناصر المدخلات معروفًا مسبقًا وصغيرًا نسبيًا.

من المهم ملاحظة أن خوارزميات الفرز الأخرى، مثل الفرز السريع أو الدمج، عادةً ما يكون لها تعقيد زمني قدره O(n log n)، والذي يعتبر فعالاً للعديد من التطبيقات العملية. توفر خوارزميات فرز الوقت الخطي، مثل الفرز الرقمي، بديلاً عندما تسمح بعض القيود أو خصائص الإدخال باستخدام تعقيد الوقت الخطي.

تاريخ

تتمتع خوارزميات فرز الوقت الخطي بتاريخ غني في علوم الكمبيوتر. يمكن إرجاع تطور النظام الزمني الخطي إلى منتصف القرن العشرين، وكانت مساهمات العلماء وعلماء الرياضيات كبيرة. واحدة من أقدم خوارزميات الفرز الخطي للوقت هي خوارزمية فرز الجرافة، التي اقترحها Harold H. Seward في عام 1954. يقوم فرز الجرافة بتقسيم عناصر الإدخال إلى عدد محدود من الجرافات ثم فرز كل مجموعة على حدة. تتميز هذه الخوارزمية بتعقيد زمني خطي إذا كان توزيع عناصر الإدخال موحدًا نسبيًا.

في عام 1959، قدم كينيث إي. إيفرسون خوارزمية جذرية تحقق تعقيدًا زمنيًا خطيًا. يقوم Radix بفرز العناصر حسب أرقامها أو علاماتها من الأقل أهمية إلى الأكثر أهمية. ويستخدم خوارزميات فرز قوية، مثل الفرز الرقمي أو الجرافة، لفرز العناصر في كل موقع رقمي. أصبح الفرز الجذري شائعًا في عصر البطاقات المثقوبة وأنظمة الكمبيوتر المبكرة. ومع ذلك، فإن خوارزمية الفرز الخطي الأكثر شهرة هي التعداد، الذي قدمه هارولد سيوارد وبيتر إلياس في عام 1954 وأعيد اكتشافه لاحقًا بشكل مستقل بواسطة هارولد إتش. 'بوبي' جونسون في عام 1961. وقد حظي الفرز الرقمي باهتمام كبير.

يكون هذا فعالًا بشكل خاص عندما يكون نطاق عناصر الإدخال معروفًا وصغيرًا نسبيًا. استمر تاريخ فرز الوقت الخطي مع تطور خوارزميات متخصصة أخرى. على سبيل المثال، في عام 1987، اقترح حنان سامت فرز شجرة التوزيع الثنائية، وهي خوارزمية فرز زمنية خطية للبيانات متعددة الأبعاد. على مر السنين، واصل الباحثون دراسة وتحسين خوارزميات الجدولة الخطية، مع التركيز على سيناريوهات وقيود محددة. على الرغم من أن الخوارزميات مثل الفرز السريع والدمج تستخدم على نطاق أوسع لكفاءتها في المزيد من السيناريوهات، إلا أن خوارزميات الفرز الزمني الخطي توفر بدائل قيمة عندما تسمح ظروف معينة باستغلال تعقيد الوقت الخطي. بشكل عام، يتميز تاريخ الفرز الزمني الخطي بالبحث عن خوارزميات فعالة يمكنها فرز مجموعات كبيرة من البيانات في الوقت الخطي، والتغلب على قيود خوارزميات الفرز القائمة على المقارنة. مهدت مساهمات مختلف الباحثين الطريق لتطوير وفهم تقنيات الفرز المتخصصة هذه.

أنواع فرز الوقت الخطي

هناك العديد من خوارزميات فرز الوقت الخطية المختلفة. النوعان الرئيسيان هما الخوارزميات القائمة على العد والخوارزميات القائمة على الجذر. فيما يلي أكثر خوارزميات فرز الوقت الخطي شيوعًا، مصنفة بناءً على الأنواع التالية:

الخوارزميات القائمة على العد

    الفرز على أساس العد:العد القائم هو خوارزمية فرز غير مقارنة. يقوم بحساب حدوث كل عنصر معين في مصفوفة الإدخال ويستخدم هذه المعلومات لتحديد الموضع الصحيح لكل عنصر في مصفوفة الإخراج التي تم فرزها. يفترض الفرز القائم على العد أن عناصر الإدخال هي أعداد صحيحة أو يمكن إضافتها إلى أعداد صحيحة.

الخوارزميات القائمة على الجذر

    فرز الجذر:Radix Sort عبارة عن خوارزمية فرز غير قائمة على المقارنة، حيث تقوم بفرز العناصر حسب أرقامها أو أحرفها. يقوم بحساب كل رقم أو تسجيل الدخول إلى العناصر من الرقم الأقل أهمية إلى الرقم الأكثر أهمية، ويفترض الفرز الجذري أن عناصر الإدخال هي أعداد صحيحة أو سلاسل.فرز دلو:يعد Bucket Sort أحد أشكال الفرز الجذري الذي يقسم العناصر إلى مجموعات ثابتة بناءً على نطاقها أو توزيعها. يتم فرز كل قطعة على حدة باستخدام خوارزمية فرز مختلفة أو فرز متكرر.MSD (الرقم الأكثر أهمية) ترتيب الجذر:MSD Radix Sort هو أحد أنواع الفرز الجذري الذي يبدأ في فرز العناصر بناءً على أهمها. فهو يقسم العناصر بشكل متكرر إلى مجموعات فرعية بناءً على قيمة الرقم الحالي ويطبق MSD Radix Sort على كل مجموعة فرعية حتى يتم حساب جميع الأرقام.LSD (الرقم الأقل أهمية) ترتيب الجذر:LSD Radix Sort هو متغير آخر يبدأ في فرز العناصر بناءً على الأقل أهمية، وهو يفرز العناصر بشكل متكرر بناءً على كل رقم من أقصى اليمين إلى أقصى اليسار، مما ينتج عنه نتيجة مرتبة. تحقق كل من خوارزميات الفرز القائمة على العد والجذر تعقيدًا زمنيًا خطيًا من خلال استغلال خصائص محددة لعناصر الإدخال، مثل نطاقها أو بنيتها التمثيلية (على سبيل المثال، الأرقام أو الأحرف). ومع ذلك، قد يختلف قابليتها للتطبيق اعتمادًا على خصائص البيانات المدخلة.

مزايا فرز الوقت الخطي

توفر خوارزميات فرز الوقت الخطي، مثل الفرز الرقمي، العديد من المزايا في سيناريوهات محددة.

    فعالة لأحجام المدخلات الكبيرة:التعقيد الزمني لخوارزميات فرز الوقت الخطي هو O(n)، مما يعني أن وقت التشغيل يزداد خطيًا مع حجم الإدخال. وهذا يجعلها فعالة للغاية بالنسبة لمجموعات البيانات الكبيرة مقارنة بخوارزميات الفرز القائمة على المقارنة مثل خوارزميات الفرز السريع أو الدمج، والتي عادةً ما يكون لها تعقيد زمني يبلغ O(n log n).لا توجد عمليات مقارنة:لا تعتمد خوارزميات الفرز الخطي، مثل فرز التعداد، على المقارنة الأولية، وبدلاً من ذلك، تستخدم سمات أو معلومات محددة حول عناصر الإدخال، مثل مدى انتشارها أو توزيعها. هذه الميزة تجعلها مفيدة عندما تكون تكلفة المقارنة مرتفعة، مثل الكائنات المعقدة أو عمليات المقارنة المكلفة.الملاءمة لخصائص إدخال محددة:غالبًا ما يكون لخوارزميات الفرز في الوقت الخطي متطلبات أو افتراضات محددة حول عناصر الإدخال. على سبيل المثال، لحساب ترتيب الفرز، تحتاج إلى معرفة نطاق عناصر الإدخال مسبقًا. عند استيفاء هذه الشروط، يمكن أن توفر خوارزميات الفرز الزمني الخطي مزايا أداء كبيرة مقارنة بخوارزميات الفرز العامة.النوع المستقر:العديد من خوارزميات الفرز الخطي، بما في ذلك الفرز العددي والجذري، مستقرة بطبيعتها. الاتساق يعني أن العناصر ذات المفاتيح أو القيم المكررة تحافظ على الترتيب النسبي في المخرجات التي تم فرزها. يمكن أن يكون هذا أمرًا بالغ الأهمية عند فرز الكائنات أو السجلات ذات السمات المتعددة أو عندما يكون الحفاظ على الترتيب الأصلي للعناصر ذات القيمة المتساوية أمرًا ضروريًا.سهولة الاستعمال:غالبًا ما تكون خوارزميات الفرز الزمني الخطي، مثل فرز التعداد، سهلة التنفيذ نسبيًا مقارنة بخوارزميات الفرز الأكثر تعقيدًا القائمة على المقارنة. يمكن أن تكون أسهل في الفهم والتصحيح، مما يجعلها مناسبة للمواقف التي تكون فيها البساطة والوضوح مطلوبة.

عيوب الفرز الزمني الخطي

على الرغم من أن خوارزميات الجدولة الخطية لها مزاياها، إلا أن لها أيضًا بعض القيود والعيوب:

    تقييد متطلبات الإدخال:غالبًا ما يكون لخوارزميات فرز الوقت الخطي متطلبات أو افتراضات محددة حول عناصر الإدخال. على سبيل المثال، لحساب ترتيب الفرز، تحتاج إلى معرفة نطاق عناصر الإدخال مسبقًا. يحد هذا القيد من إمكانية تطبيقها على الحالات التي يتم فيها استيفاء هذه الشروط. قد تصبح متطلبات الذاكرة غير عملية أو تتجاوز الموارد المتاحة إذا كان النطاق واسعًا أو غير معروف.متطلبات المساحة الإضافية:تتطلب بعض خوارزميات الفرز الزمني الخطي، مثل الفرز الرقمي، مساحة إضافية لتخزين المصفوفات أو هياكل البيانات الأخرى. غالبًا ما تكون المساحة المطلوبة متناسبة مع عدد عناصر الإدخال. يمكن أن يكون هذا عيبًا عندما يكون استخدام الذاكرة مشكلة، خاصة عند التعامل مع مجموعات كبيرة من البيانات أو موارد الذاكرة المحدودة.عدم وجود تنوع:خوارزميات فرز الوقت الخطي هي خوارزميات متخصصة مصممة لسيناريوهات أو قيود محددة. قد تحتاج إلى أن تكون أكثر ملاءمة وكفاءة لمهام الفرز العامة أو توزيعات المدخلات المختلفة. تعد خوارزميات الفرز القائمة على المقارنة، مثل الفرز السريع أو الدمج، أكثر تنوعًا ويمكنها التعامل مع نطاق أوسع من نطاق الإدخال.غير فعال للنطاقات الصغيرة أو البيانات المتفرقة:تكون خوارزميات الفرز في الوقت الخطي مثل التعداد أكثر كفاءة عندما يكون نطاق عناصر الإدخال صغيرًا وموزعًا بكثافة. إذا كان النطاق واسعًا أو كانت البيانات متفرقة (أي عدد قليل فقط من القيم المميزة)، فقد توفر الخوارزمية الوقت والجهد في معالجة الأجزاء الفارغة أو ذات الكثافة السكانية المنخفضة من نطاق الإدخال.يقتصر على أنواع بيانات محددة:تم تصميم خوارزميات الفرز في الوقت الخطي، مثل فرز التعداد، في المقام الأول لفرز الأعداد الصحيحة غير السالبة أو كائنات القيمة الرئيسية. وقد لا تكون مناسبة لفرز أنواع البيانات الأخرى، مثل أرقام الفاصلة العائمة أو السلاسل أو هياكل البيانات المعقدة. قد يتطلب تكييف خوارزميات فرز الوقت الخطي للتعامل مع أنواع البيانات المختلفة أو وظائف المقارنة المخصصة معالجة مسبقة أو تعديلات إضافية.

عند اختيار خوارزمية الفرز، من الضروري النظر بعناية في تفاصيل البيانات المدخلة ومتطلبات مشكلة الفرز. في حين أن خوارزميات الجدولة الخطية توفر مزايا في سيناريوهات محددة، إلا أنها في بعض الأحيان تكون الخيار الأكثر ملاءمة أو كفاءة.

755 شمود

تطبيقات خوارزميات الفرز الزمني الخطي

تتميز خوارزميات الفرز الزمني الخطي بالكفاءة ولها العديد من التطبيقات في مختلف المجالات. فيما يلي بعض التطبيقات النموذجية للنظام الزمني الخطي:

    فرز الأعداد الصحيحة ذات المدى الصغير:تعد خوارزميات الفرز الزمني الخطي، مثل فرز العد والفرز الجذري، مثالية لفرز صفائف الأعداد الصحيحة عندما يكون نطاق القيم هو. تحقق هذه الخوارزميات تعقيدًا زمنيًا خطيًا من خلال وضع افتراضات حول بيانات الإدخال، مما يسمح لها بتجاوز الفرز القائم على المقارنة.فرز السلسلة:يمكن أيضًا تطبيق خوارزميات الفرز الزمني الخطي لفرز السلاسل بكفاءة. من خلال أخذ الخصائص الفريدة للسلاسل، مثل طولها أو أحرفها، يمكن لخوارزميات مثل Radix Sort تحقيق تعقيد زمني خطي عند فرز السلاسل.وظائف قاعدة البيانات:يعد الفرز وظيفة أساسية لخوارزميات الفرز الزمني الخطي حيث يمكنها فرز مجموعات البيانات الكبيرة بكفاءة بناءً على أعمدة أو حقول محددة. وهذا يتيح معالجة أسرع للاستعلام وأداء أفضل في عمليات قاعدة البيانات.إنشاء الرسوم البيانية:تعد الرسوم البيانية ضرورية لمختلف المهام الإحصائية وتحليل البيانات. يمكن لخوارزميات الفرز الزمني الخطي، مثل الفرز الرقمي، إنشاء رسوم بيانية عن طريق حساب تكرارات العناصر في مجموعة البيانات بكفاءة.الفرز الخارجي:يتم استخدام تقنية الفرز الخارجي في السيناريوهات التي لا يمكن فيها احتواء البيانات بالكامل في الذاكرة. يمكن لخوارزميات الفرز الزمني الخطي، مثل فرز الجذر الخارجي أو فرز العد الخارجي، فرز مجموعات البيانات الكبيرة المخزنة على القرص أو أجهزة التخزين الخارجية الأخرى بكفاءة.جدولة الحدث:يمكن لخوارزميات فرز الوقت الخطي جدولة الأحداث بناءً على أوقات البداية أو النهاية. يؤدي فرز الأحداث بترتيب تصاعدي إلى تسهيل تحديد التعارضات أو الفترات المتداخلة أو العثور على الفترة التالية المتاحة.تحليل ملفات السجل:يعد تحليل ملفات السجل مهمة شائعة في إدارة النظام وتصحيح الأخطاء. يمكن استخدام خوارزميات الفرز الزمني الخطي لفرز السجلات بناءً على الطوابع الزمنية، مما يسهل تحديد الأنماط أو الحالات الشاذة أو البحث عن أحداث معينة.ضغط البيانات:يلعب الفرز دورًا أساسيًا في تقنيات ضغط البيانات المختلفة. تعتمد الخوارزميات مثل Burrows-Wheeler Transform (BWT) أو Move-To-Front Transform (MTF) على ترتيب الوقت الخطي لإعادة ترتيب البيانات لتحسين كفاءة الضغط. هذه مجرد أمثلة قليلة لتطبيقات خوارزميات فرز الوقت الخطي.

تنفيذ الفرز الزمني الخطي في C++

فيما يلي مثال لبرنامج يقوم بتنفيذ فرز العد، وهو عبارة عن خوارزمية فرز خطية للوقت:

 #include #include using namespace std; void countingSort(vector&amp; arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table&apos;s maximum value to determine the worksheet&apos;s size. It then counts each element&apos;s occurrence and calculates the worksheet&apos;s prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>

يشير هذا إلى أن مصفوفة الإدخال قد تم فرزها بترتيب تصاعدي باستخدام خوارزمية فرز العد، مما يؤدي إلى المصفوفة التي تم فرزها [1، 2، 2، 3، 3، 4، 8].

في برنامج C++ هذا، تأخذ وظيفة فرز العد مرجعًا إلى المتجه وتقوم بتشغيل روتين فرز العد. يبحث عن القيمة القصوى للجدول لتحديد حجم ورقة العمل. ثم يحسب حدوث كل عنصر ويحسب مجموع بادئة ورقة العمل. ثم يقوم بإنشاء متجه نتيجة ويرتب العناصر وفقًا لورقة العمل. وأخيرًا، يقوم بنسخ العناصر التي تم فرزها مرة أخرى إلى المصفوفة الأصلية. في الوظيفة الأساسية، يتم فرز مصفوفة المثال {4، 2، 2، 8، 3، 3، 1} بواسطة خوارزمية فرز التعداد وطباعتها كمصفوفة مرتبة. لاحظ أن البرنامج يستخدم المكتبات للعمل مع المتجهات والعثور على الحد الأقصى لعنصر المصفوفة باستخدام الدالة max_element.