الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خوارزمية ترتيب من تصميمي

مغلق
بدأه عربي عربي في 12 يونيو 2007 · 23 رد · 8,400 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بما أني لا أجيد قراءة الخوارزميات، واحتجت إلى خوارزمية ترتيب، فقد صممت واحدة، أحببت أن أشارك بها لمن لا يجيد قراءة الخوارزميات.

خوارزمية ترتيب

لنفرض السلسلة التالية من الأرقام المسجلة عشوائيا في خانات هذه السلسلة (س) ونريد أن نرتبها تصاعديا:

الخانة: 0 1 2 3 4 5 6 7 8 9

القيمة: 15 12 68 56 23 82 28 7 14 89

نختار إحدى القيم عشوائيا، ولتكن القيمة المسجلة في الخانة (0)، وهي 15

نبدأ دورة المقارنة:

- نسمي القيمة التي اخترناها بـ (الأساس)

- نسمي رقم الخانة التي تحوي الأساس بـ(المبدأ)

في هذه الحالة: الأساس: 15، المبدأ 0

- ننشيء سلسلتين فارغتين، الأولى للقيم الأعلى من الأساس (سع)، والثانية للأصغر(سص).

- نبدأ حلقة المقارنة، وعند كل عملية مقارنة، يجب أن نصل إلى نتيجة: القيمة المقارنة أصغر أو أكبر من الأساس. (طبعا لا يجب أن نقارن الأساس مع نفسه، لذا وفي هذه الحالة، كان الأساس هو الخانة (0)، لذا نبدأ من الخانة (1) بعملية المقارنة)

- نسجل القيمة التي قارناها بحسب نتيجة المقارنة، فإذا كانت القيمة أكبر من الأساس تسجل في السلسلة الخاصة بالقيم الأعلى، والعكس بالعكس. مثلا: مقارنة (1) مع (أساس) تعطي أن (1) أصغر، وبالتالي (1) يتم تسجيلها في (سص) سلسلة الأصغر.

- تنتهي حلقة المقارنة، ونخرج بسلسلتين (سع) و(سص) حيث أن جميع عناصر (سع) أكبر من (0) أو (أساس) وجميع عناصر (سص) أصغر من (أساس) أو (0).

- عرفنا الآن وبشكل مباشر موقع (0) الجديد والنهائي وفق الترتيب التصاعدي الذي اخترناه سلفا، والترتيب الجديد للقيمة الموجودة في (0) (تصاعديا) هو طول السلسلة (سص) + مبدأ!! وهذا طبيعي(أنظر الخطوة السابقة لتعرف لماذا)، المهم الآن أن نسمي الموقع الجديد للأساس والذي اكتشفناه للتو، وليكن اسمه (مرتب).

- بما أن الخوارزمية عودية (تكرارية)، ننفذ هذه الحلقة من جديد مرة بالنسبة لـ(سص) ومرة بالنسبة لـ(سع).

- عند تنفيذ الحلقة بالنسبة لـ(سع)، وكما في بداية الحلقة، يجب أن نحدد الأساس والمبدأ في السلسلة الجديدة، فإذا اخترنا سع(0) كأساس، يكون المبدأ: (مرتب) + 0 + 1، وإذا كان الأساس لـ (سع) هو سع(3) يكون المبدأ: (مرتب) + 3 + 1

أما بالنسبة لـ(سص) يكون المبدأهو نفس المبدأ الحالي.

الشرح:

لنحاكي مجرى الأحداث لكي نفهم خطوات الخوارزمية:

بداية ننشيء سلسلة جديدة (ر) تختوي الترتيب النهائي لعناصر س، وهي بنفس طول س.

أول مرة:

- المبدأ = 0

- الأساس = س(0) = 15

- سص = سلسلة جديدة (وهي سلسلة الأرقام الأصغر من أساس)

- سع = سلسلة جديدة (وهي سلسلة الأرقام الأعلى من أساس)

حلقة مقارنة(ب = 1، إلى ب < طول(س)، ب + 1)

إذاكانت س(ب) أصغر من أساس، أضف س(ب) إلى سص

إذا س(ب) أكبر أو تساوي أساس، أضف س(ب) إلى سع

انتهت الحلقة.

ينتج من الحلقة:

سص{12، 7، 14}

سع{68، 56، 23، 82، 28، 89}

نحسب الموقع الجديد(مرتب) لـ(أساس) ضمن السلسلة النهائية(ر)

مرتب = مبدأ + طول(سص) = 0 + 3 = 3

إذن، ر(3) = أساس = 15

الآن يجب أن نعيد الكرة لـ(سص) و(سع)، وهذا يستوجب منا تحديد المعطيات الجديدة لكل حالة.

من أجل سص:

الأساس = سص(0) = 12

// المبدأ = المبدأ(الحالي) = 0

ونبدأ الحلقة على هذا الأساس، وبنهايتها، نجد:

(انتبه أن سص، و سع هنا هما غير السابقتين، لأننا نفوم بالحلقة على سص السابقة وليس س)

سص{7}

سع{14}

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

على كل يجب أن نحدد الموقع الجديد للأساس قبل كل شيء.

كما في السابق: مرتب = مبدأ + طول(سص) = 0 + 1 = 1

أي أن ر(1) = أساس = 12

تقوم بالتحقق من طول(سص) قبل إرسالها بشكل تكراري للدورة، نجد أن طولها < 3 هذا معناه أنه من الأفقضل أن نعالجها بشكل يدوي، بطبيعة الحال نكتشف أن الموقع الجديد للعنصر الوحيد لـ(سص) هو:

مرتب – 1 = 0

أي أن ر(مرتب - 1) = سص(0) = 7

هنا ر(0) = 7

وهي أصغر قيمة في السلسلة (س)

أيضا سع أحادية، وبالتالي ر(مرتب + 1) = سع(0)

هنا ر(2) = 14

أصبحت السلسلة ر:

{7، 12، 14، 15، ؟، ؟، ؟، ؟، ؟، ؟}

العلامة (؟) تعني أننا لم نضع فيها شيء بعد.

من أجل سع: (الخاصة بـ (س))

للتذكير: سع{68، 56، 23، 82، 28، 89}

الأساس = سع(0) = 68

المبدأ = المرتب + 1 = 3 + 1 = 4

نلاحظ أهملت الصفر الخاص بـ سع(0)، لكن لو كان الأساس الجديد من خانة غير الصفر وجبت إضافته.

بتنفيذ الحلقة:

سص{56، 23، 28}

سع{82، 89}

نحسب الموقع الجديد لـ(أساس) ضمن ر

مرتب = مبدأ + طول(سص) = 4 + 3 = 7

تصبح ر:

{7، 12، 14، 15، ؟، ؟، ؟، 68، ؟، ؟}

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

وبالتالي وعند معالجاتها، تصبح ر:

{7، 12، 14، 15، ؟، ؟، ؟، 68، 82، 89}

بقي لدينا (سص)، وبالتالي يجب أن نحدد المبدأ لها:

المبدأ = المبدأ(الحالي) = 4

الأساس = سص(0) = 56

نحصل على:

سص{23، 28}

سع{}

نحسب المرتب:

مرتب = مبدأ + طول(سص) = 4 + 2 = 6

أي أن ر(6) = أساس = 56

واضح أن سع هي حالة خاصة لأنها فارغة، ولا داعي لفعل شيء لها، أيضا سص حالة خاصة.

تصبح ر:

{7، 12، 14، 15، ؟، ؟، 56، 68، 82، 89}

وبحل سص، تصبح ر:

{7، 12، 14، 15، 23، 28، 56، 68، 82، 89}

المهم في هذه الخوارزمية تذكر أن (مرتب) و(مبدأ) أي عملية هو كالتالي:

مرتب = مبدأ + طول(سص)

مبدأ:

بالنسبة لـ (سص) هو نفسه مبدأ العملية التي جرت.

بالنسبة لـ(سع) هو المرتب الذي حسبناه مضافا إليه واحد: مبدأ = مرتب + 1

أما بالنسبة لأول مرة، تكون هذه القيم صفر:

مرتب = 0

مبدأ = 0

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

من ميزات هذه الخوارزمية، أن كل دورة تحدد لنا ترتيب نهائي لقيمة واحدة، أي أن عدد الدورات مساو أو أقل من طول السلسلة الأساسية(أقل عند ظهور الحالات الخاصة).

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

قمت بتجربتها على سجل يحوي أكثر من ألف اسم للقيام بترتيب الأسماء أبجديا، وكان أداؤها جيدا.

من مساوئها أنها غير عملية عند إضافة خانات جديدة للسلسلة، وهنا يجب اتباع تكتيك آخر.

أيضا من مساوئها أننا نحتاج إلى سلسلة إضافية (ر) لتخزين القيم المرتبة مما يضاعف حجم الذاكرة المطلوبة.

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

على كل حال هذه مساهمتي، أتمنى أن تفيد وأن تطلعوني عما لديكم.

أرجو أن أكون قد أوضحت الفكرة.

#2

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

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

أنتظر المزيد منك خاصة فيما يتعلق بـ flow chart و algorithm و steps

#3

حسناً أنا بالانتظار، وفي أمان الله

#4

اولا هذا الجورثيم .. ليس بسيط ...

كما ان شرحك ليس مفهوم لدرجه ! ... افضل ان تكتب كود يعمل بالجوريتم هذا ..

كما انه يبدو لي انه سيستهلك N^2 من الذاكره ... وايضا بتواجد الجوريتم قريب منه والذي اشك انك اخذت منه ! ... ;) > َQuick Sort Algorithm!

Writen By: Admirer4 , B.Sc Student of EE.

Learn C Programming Language

ِCowards die many times before their death

#5

أخ admire4 هلا أفدتنا في كيفية حساب استهلاك الذاكرة؟

#6

السلام عليكم

تصميم خوارزمية هى من مهام المبرمج, ولها قواعد واسس يجب ان تتبع..

بعض الاشياء ذكرها الدكتور عبد الرحمن والبعض الاخر تم التطرق له من خلال admiral الا وهو استهلاك الذاكرة, وايضاً هناك عامل الوقت..

تصميم خوارزمية ترتيب تحديداً ليس بالامر السهل وذلك لانك إذا صممت خوارزمية, يجب عليك ان تقارنها بالخوارزميات الموجودة حالياً ويجب ان تثبت بانها افضل من الخوارزميات الموجوده امثال merge sort و Quick sort. ولكن مجرد ان تصمم خوارزمية ترتيب فهذا امر بسيط جداً يستطيع ان يقوم به اى شخص, على سبيل المثال اعطي اي شخص مجموعة من الارقام واطلب منه ان يقوم بترتيبها, بالتاكيد سوف يقوم بإستخدام طريقة يقوم بتاليفها فى تلك اللحظة وعلى اساسها يقوم بترتيب الارقام, ولكن السؤال هو هل طريقته افضل من الطرق المتعارف عليها؟

على حسب ما فهمت من الخوارزمية فهى لا تستهلك ذاكرة بمعدل N^2 كما ذكر الاخ ادمرال وإنما تستهلك 3*N والعدد الصحيح دئماً فى حساب الخوارزميات لا قيمة له لذلك نستطيع ان نقول بالنسبة لإستهلاك الذاكرة برنامج يستهلك بمعدل N, ولتبسيط المسئلة دعنا نقول انك تريد ان ترتب 100 رقم فما هو حجم الذاكرة الذى تحتاجه؟ بالتاكيد هو 3 * 100 لانك تحجز ثلاث اضعاف العدد الذي تريد ان تقوم بترتيبه .. هذا لا يعنى ان الذاكرة التى تستهلكها تساوي 100 بايت وإنما يعنى ان درجة نمو الذاكرة هو عدد ثابت وليس عدد مرفوع, يعنى 100 بايت لن يصبحو 10000 بايت وإنما سوف تصبح الذاكرة 300 ونموها هو نمو ثابت وليس نمو بمعدل N^2 او N! الخ..

المشكلة تكمن فى عملية الترتيب نفسها فانت تقوم بإستخدام حلقة داخل حلقة داخل حلقة وهذا يعنى ان الخوارزمية المقترحة تستهلك وقت بمعدل N^3 قارن ذلك بخوارزمية merge sort والتى تستهلك وقت بمعدل NlogN حتى خوارزمية bobble sort والتى تعتبر اضعف خوارزمية ترتيب تستهلك وقت بمعدل N^2..

كنت قد كتبت درس بهذا الخصوص منذ حوالي عامين او ثلاثة حاول ان تبحث عنه, فيه شرح مبسط لكيفية حساب الوقت والمساحة بالنسبة للخوارزميات...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#7

اظن ان احسن الخورزميات في هذا المجال هي الفقاعية

حيث ان الخورزمية تقوم بمقارنة العدد في الخانة 1 و2 اذا وجدت العدد في الخانة الاولى اكبر من الخانة الثانية

تقوم بتبديل اماكن العددين في ما بينهما وهكذا مع الخانة 2 و3 وكذلك 3 و4 الخ

عندما تصل الخورزمية للعدد الاكبر يقوم هذا العدد بالتقدم للامام لان كل الاعداد التي تليه اصغر منه

وعندما تصل الدالة الى اخر خانة تكون قد وضعت العدد الاكبر في الخانة الاخيرة لهذا تسمى الفقاعية

لان العدد يطفو الى فوق

ثم تعيد الخورزمية البداية من جديد وبمان العدد الاكبر ذهب الى الخانة الاخير العدد الاصغر منه مباشرة سوف يطفو ايضا

لان العدد الوحيد الاكبر منه موجود في الخانة الاخيرة ولا يوجد عدد يوقف تقدمه

وهكذا دواليك

#8

مشاركة ذات صلة بالفرز

' date= كتب:
هذا ترتيب تصاعدي وهو يعتبر أسرع أنواع الترتيب حيث يوجد أنواع مختلفة وهي :

الفرز الفقاعي Bubble Sort

الفرز بالإختيار Selection sorting

الفرز بالإدخال Sorting by Insertion

الفرز بطريقة شل (المتراكب أو الطبقي) Shell Sort

الفرز السريع Quick Sort

Sub QuickSort(Down, Up As Long, Num As Variant) 
  Dim M, K, X, Temp As Long 

  M = Down 
  K = Up 
  X = Num(Fix((Down + Up) / 2)) 

  Do 
	Do While Num(M) < X: M = M + 1: Loop 
	Do While Num(K) > X: K = K - 1: Loop 
	If M <= K Then 
	  Temp = Num(M): Num(M) = Num(K): Num(K) = Temp 
	  M = M + 1 
	  K = K - 1 
	End If 
  Loop Until M > K 

  If Down < K Then Call QuickSort(Down, CLng(K), Num) 
  If M < Up Then Call QuickSort(M, Up, Num) 
End Sub

تم تعديل هذه المشاركة بواسطة Accessna في 28 يونيو 2007 في 22:40

#9

اقتباس
السلام عليكم اخى admier4

هون عليك اخى لماذا هذا الرد الشديد ولماذا ه

الاخ عربى عربى ذكر انة ممكن ان يكون موجود وهو لا يعرف وتحدث معنا هذة الامور كثير نطور ونكتشف ان الفكرة عرضت من قبل

ثم انة قال انة يستهلك memeory وهذا واضح

لكن لماذا ليس بسيط ممكن تشرح وجهة نظرك

يا يمكن انا اخطى في استخدام الاشارات التعبيريه .. ردي ليس سوى برد عادي ... احببت ان اقدم نوع من سلبيات ونقاط ضعف الالجوريتيم من خلال نظره انتقاديه اوليه ...

كما انه اذا ذكر الاخ بأن هذا الالجوريتيم يستهلك ذاكره .. هذا ليس سوى نقطه ضعف لا يمكن تجاهلها !

اقتباس
أخ admire4 هلا أفدتنا في كيفية حساب استهلاك الذاكر

هذا كان من نظره اوليه ... لالجوريتيم ويأتي مع الخبره ... لكن لطرق الحساب الدقيقه تكون بعد تصميم الكود نفسه ... فهذا ليس سوى نظره اوليه .. والتي صحيحه حسب رأيي

اقتباس
على حسب ما فهمت من الخوارزمية فهى لا تستهلك ذاكرة بمعدل N^2 كما ذكر الاخ ادمرال وإنما تستهلك 3*N والعدد الصحيح دئماً فى حساب الخوارزميات لا قيمة له لذلك نستطيع ان نقول بالنسبة لإستهلاك الذاكرة برنامج يستهلك بمعدل N, ولتبسيط المسئلة دعنا نقول انك تريد ان ترتب 100 رقم فما هو حجم الذاكرة الذى تحتاجه؟ بالتاكيد هو 3 * 100 لانك تحجز ثلاث اضعاف العدد الذي تريد ان تقوم بترتيبه .. هذا لا يعنى ان الذاكرة التى تستهلكها تساوي 100 بايت وإنما يعنى ان درجة نمو الذاكرة هو عدد ثابت وليس عدد مرفوع, يعنى 100 بايت لن يصبحو 10000 بايت وإنما سوف تصبح الذاكرة 300 ونموها هو نمو ثابت وليس نمو بمعدل N^2 او N! الخ..

اخ احمد .. انت مخطى راجع حساباتك من جديد ... كما انه احببت ان اضيف كما اضفت من قبل هذا ليس سوى من نظره اولبه ... كما انني اشك في انه سيكون اعلى من

N^2

ايضا ! ... كذلك لا يمكن ان تتحدث عن امور دقيقه قبل وجود الكود ... كما احببت ان اعطيك الرمز الذي يشير الى انها ستكون

N^2

اولا وقبل كل شي ... معروف ولا اظن انه مبهم ان

Recorsive Functions

ستأخذ كحد ادنى

N

ذلك لانها سوف تستخدم كل من

Stack Memory & heap Memory

من خلال مناداتها على نفسها ...

ومن خلال رؤيتي للجوريتيم رأيت انه يستخدم

2 Data Arrays !

اي انه في كل داله يستهلك

2N

لدينا اذن

N* 2N ~ N^2

اقتباس
اظن ان احسن الخورزميات في هذا المجال هي الفقاعية

ليس كذلك ابدا ... ممكن هذا بالنسبه لك ... اما الموجود في التصيميم والمستعمل بكثره هن :

1- MAX Sort - because it's too simple, effictive N^2 without mem.

2- Quick Sort - baucase it's quick one, effictive can go to NlogN*

*هذا الحساب احصائي وليس حساب عادي .. الالجوريتيم عادي يأخذ

N^2

3- Merge Sort - The faster ! (NlogN)

Writen By: Admirer4 , B.Sc Student of EE.

Learn C Programming Language

ِCowards die many times before their death

#10

السلام عليكم

اخى ادمايرير انا راجعت حساباتي ووجدت ان حساب سرعة الخوارزمية او استهلاك الذاكرة متعلق بتصميم الخوارزمية وباختيار انسب الطرق لتطبيقها برمجياً.

انت تريد ان تستخدم recursion وهذا يعتبر اسواء طريقة لانه كما ذكرت يستهلك المكدس فى كل عملية استدعاء للداله, ولكن إذا استخدمت global array فلن تستهلك اكثر من مساحة الـarray فقط..

نقطة هامة جداً فى حساب سرعة الخوارزمية هى انك لا تحتاج لتحويل الخوارزمية لشفرة كمبيوتر, لان مادة الخوارزميات وحساب سرعتها او استهلاكها للذاكرة ليس جزء من مادة الحاسوب وإنما هو جزء من مادة الرياضيات, لذلك عندما درسنا ايام الجامعة مادة الخوارزميات درسناها اولاً كجزء من مادة الرياضيات وبعد ذلك قمنا بدارسة مادة تطبيقية بواسطة الحاسوب.

اما بالنسبة لاسرع خوارزمية ترتيب فلا يوجد خوارزمية سريعة فى جميع الحلات وإنما يتوقف الامر على المعطيات, فترتيب 10 اعداد ليس باى حال من الاحوال كترتيب 100000 عدد, كذلك استهلاك الذاكرة يختلف من خوارزمية لاخرى. اما ان تقول ان الخوارزمية الفلانية اسرع من الخوارزمية العلانية فهذا هراء إن لم تدعم زعمك بحسابات واحصائيات تثبت بها ذلك, الفرق بين الخوارزميات ليس كالفرق بين الوندوز واللينكس, يعنى لا نستطيع ان نقول ان الخوارزمية الفلانية افضل فقط لانى احبها ولانها جميله , ولكن هناك قواعد واسس لاثبات ذلك وإذا عجزت عن ان تثبت ان الخوارزمية A افضل من الخوارزمية B فلا داعي للدخول فى حوار اصلاً...

هناك خوارزميات تستطيع ان ترتب الاعداد بسرعة N ولكنها لا تصلح ان تطبق على جميع الحالات, فهل نقول ان هذه الخوارزميات هى الافضل؟ بالتاكيد لا لانها فى تصلح لجميع الحالات..

ومثال على هذا النوع من الخوارزميات هناك خوارزمية تدعى Bucket sorting وفى بعض الحالات تكون سرعتها NlogN تماماً مثل الmarge sort لذلك يجب ان نكون حذرين قبل ان نقحم انفسنا فى نقاش الخوارزميات بدون ان ندرس المادة دراسة شاملة..

والسلام عليكم

تم تعديل هذه المشاركة بواسطة احمد غريب في 29 يونيو 2007 في 00:25

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11
احمد غريب كتب:
اما بالنسبة لاسرع خوارزمية ترتيب فلا يوجد خوارزمية سريعة فى جميع الحلات وإنما يتوقف الامر على المعطيات, فترتيب 10 اعداد ليس باى حال من الاحوال كترتيب 100000 عدد, كذلك استهلاك الذاكرة يختلف من خوارزمية لاخرى. اما ان تقول ان الخوارزمية الفلانية اسرع من الخوارزمية العلانية فهذا هراء إن لم تدعم زعمك بحسابات واحصائيات تثبت بها ذلك, الفرق بين الخوارزميات ليس كالفرق بين الوندوز واللينكس, يعنى لا نستطيع ان نقول ان الخوارزمية الفلانية افضل فقط لانى احبها ولانها جميله , ولكن هناك قواعد واسس لاثبات ذلك وإذا عجزت عن ان تثبت ان الخوارزمية A افضل من الخوارزمية B فلا داعي للدخول فى حوار اصلاً...

هناك خوارزميات تستطيع ان ترتب الاعداد بسرعة N ولكنها لا تصلح ان تطبق على جميع الحالات, فهل نقول ان هذه الخوارزميات هى الافضل؟ بالتاكيد لا لانها فى تصلح لجميع الحالات..

ومثال على هذا النوع من الخوارزميات هناك خوارزمية تدعى Bucket sorting وفى بعض الحالات تكون سرعتها NlogN تماماً مثل الmarge sort لذلك يجب ان نكون حذرين قبل ان نقحم انفسنا فى نقاش الخوارزميات بدون ان ندرس المادة دراسة شاملة..

ما أدري لماذا هذا التشنج !!!؟

وهل العلم حكرا على أحد دون الآخرين !!!

ثم مسألة الأسرع هذه تحصل عليها بعد تجارب عديدة وتمت عمل برنامج يقوم بالمقارنة وحساب الوقت عليها وطبعا كلها خضعت لنفس الظروف أي لنفس عدد السجلات ونوع البيانات وهذه الأنواع مؤلف بها كتب عدة ولم تأتي حسب أهوائنا .

أعصابك أخي حتي يمكننا أن نزاحمكم لاحقا إلا إذا كنتم ممن لا يحب الأغراب .. فسنمتنع لأجل خاطرك

تم تعديل هذه المشاركة بواسطة Accessna في 29 يونيو 2007 في 01:25

#12

السلام عليكم

التشنج سببه كمية المعلومات الخاطئة التى تنشر بدون علم وكان المسئلة مسئلة راي, المواضيع العلمية وخاصة المتعلقة بالرياضيات لا تخضع للاراء وإنما للاثباتات..

تخيل كم مبتدئ ياتي ليقراء ويستفيد ثم نقوم بإعطائه معلومات خاطئة..

العلم ليس حكر على احد ونحن هنا حتى نتبادل المعرفة ونفيد ونستفيد, لذلك كل معلومه خاطئة تعني خطوة إلى الخلف ونحن لا نريد ان نعود للخلف وإنما نريد ان نتقدم..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#13

اقتباس
اخى ادمايرير انا راجعت حساباتي ووجدت ان حساب سرعة الخوارزمية او استهلاك الذاكرة متعلق بتصميم الخوارزمية وباختيار انسب الطرق لتطبيقها برمجياً.

صحيح لكن يجب رؤيه الالجوريتيم بالكامل ... ولذلك انا شخصيا افضل ان ارى كود .. الذي يعلم الالجوريتيم ...

اقتباس
انت تريد ان تستخدم recursion وهذا يعتبر اسواء طريقة لانه كما ذكرت يستهلك المكدس فى كل عملية استدعاء للداله

صحيح لكن هذا لم يكن من عندي .. حسب ما اذكر رأيت ذلك من كاتب الالجوريتيم الذي ينوي ذلك !

اقتباس
استدعاء للداله, ولكن إذا استخدمت global array فلن تستهلك اكثر من مساحة الـarray فقط..

هذا اسوأ نمط في البرمجه ... ولا يمكن لأحد ان يستعمل اذا كان يود البرمجه باتقان

اقتباس
نقطة هامة جداً فى حساب سرعة الخوارزمية هى انك لا تحتاج لتحويل الخوارزمية لشفرة كمبيوتر, لان مادة الخوارزميات وحساب سرعتها او استهلاكها للذاكرة ليس جزء من مادة الحاسوب وإنما هو جزء من مادة الرياضيات, لذلك عندما درسنا ايام الجامعة مادة الخوارزميات درسناها اولاً كجزء من مادة الرياضيات وبعد ذلك قمنا بدارسة مادة تطبيقية بواسطة الحاسوب.

الحاجه للكود .. هي فهم الالجوريتيم بصوره اسهل ... لكن بالنسبه لمعالجه الخورزميات اظن ان هذا الموضوع ناقص عندكم في الجامعات .. لانه وبعد معالجه الخوارزميات بصوره رياضيه تتم ايضا معالجاتها بصوره متعلقه بالبيئه اي الاجهزه

بامكانك النظر :

http://www.softpanorama.org/Algorithms/sorting.shtml

اقتباس
اما بالنسبة لاسرع خوارزمية ترتيب فلا يوجد خوارزمية سريعة فى جميع الحلات وإنما يتوقف الامر على المعطيات, فترتيب 10 اعداد ليس باى حال من الاحوال كترتيب 100000 عدد, كذلك استهلاك الذاكرة يختلف من خوارزمية لاخرى. اما ان تقول ان الخوارزمية الفلانية اسرع من الخوارزمية العلانية فهذا هراء إن لم تدعم زعمك بحسابات واحصائيات تثبت بها ذلك

هذا موجود في احصائيات منذ زمن لكن يبدو انك لا تتابع هذه المواضيع :

http://en.wikipedia.org/wiki/Sorting_algorithm

اقتباس
يعنى لا نستطيع ان نقول ان الخوارزمية الفلانية افضل فقط لانى احبها ولانها جميله , ولكن هناك قواعد واسس لاثبات ذلك وإذا عجزت عن ان تثبت ان الخوارزمية A افضل من الخوارزمية B فلا داعي للدخول فى حوار اصلا

ً..

لا احد يصنف حسب حبه ... !! .. لكن اذا كان قصدك مستوى تعقيد الالجوريتيم .. فهذا موجود ... لن ادخل معك في جدال على هذا يكفي ان ترى انه في الموقع قد اضافوا تصنيف حسب تعقيد الالجوريتيم مما بعني انه عامل مهم !

الموقع :

http://www.devx.com/vb2themax/Article/19900

اقتباس

هناك خوارزميات تستطيع ان ترتب الاعداد بسرعة N ولكنها لا تصلح ان تطبق على جميع الحالات, فهل نقول ان هذه الخوارزميات هى الافضل؟ بالتاكيد لا لانها فى تصلح لجميع الحال

هذا معروف ... كما اننا نتحدث عن الجوريتمات شامله ... ولا تقوم بفرضيات اخرى ...

Writen By: Admirer4 , B.Sc Student of EE.

Learn C Programming Language

ِCowards die many times before their death

#14
اقتباس
10 اعداد ليس باى حال من الاحوال كترتيب 100000 عدد

كيف تعتبر ترتيب 10 اعداد ليس كترتيب 100000 عدد

انا اعرف ان عداء 100 متر ليس كعداء 10000 متر :lol:

بالنسبة للمعلومة عندما يضع العضو معلومة فمستهلك المعلومة يعرف ان كاتبها

عضو وطالب مثله والخطا ان ادعي اني دكتور و مصدر موثوق

لكن اذا اعطيت معلومة بصفتك عضو فلا حرج والله اعلم

يا اخ غريب انت انتقدتنا ولم تعطي لنا البديل

ارجوا ان تمدنا بمعلومات حول الامر

شكرا

تم تعديل هذه المشاركة بواسطة bachirk في 29 يونيو 2007 في 02:06

#15

السلام عليكم

اقتباس
الحاجه للكود .. هي فهم الالجوريتيم بصوره اسهل ... لكن بالنسبه لمعالجه الخورزميات اظن ان هذا الموضوع ناقص عندكم في الجامعات .. لانه وبعد معالجه الخوارزميات بصوره رياضيه تتم ايضا معالجاتها بصوره متعلقه بالبيئه اي الاجهزه

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

http://www.nada.kth.se/~viggo/problemlist/compendium.html

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#16
احمد غريب كتب:
السلام عليكم

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

http://www.nada.kth.se/~viggo/problemlist/compendium.html

والسلام عليكم

أو يمكن MIT كمان جامعة متخلفة في علوم الحاسب طبقا لكلام الأخ admirer4

لإنهم مبيدوش في كورس الAlgorithms أي تحليل له يكون معتمد على نوع البيئة أو المعالج و كله مكتوب Pseudocode شفت بقه قمة التخلف ......

#17

الحقيقة هناك كلام صحيح عند كل منكم، وخاطئ عند كل منكم، بالنسبة للأخ أحمد غريب قال: لا يوجد خوارزمية سريعة فى جميع الحالات، وهذا كلام منطقي، فلو كانت السلسلة متغيرة وديناميكية، فأظن أن Sort by Insert أفضل، وتقريبا هي الخوارزمية الوحيدة التي أعرفها جيدا، أم بالنسبة لكلامه بأن استهلاك الوقت هو N^3 فهو أبعد ما يكون عن الصحة، من الحسابات التي أجريتها يأخذ الوقت الشكل N مضروبا بثابت أظنه لوغارتمي، أي كلما زادت عدد خانات N مثلا 10 100 1000 10000 يزداد الزمن وقد أشار إلى ذلك الأخ admire4

أريد متطوع يحول هذه الخوارزمية إلى صيغة خوارزميات نظامية، وذلك لكي تتضح الصورة لنا أكثر.

سأنشر الكود قريبا.. كود جافا

#18

السلام عليكم

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

اسرع خوارزمية لا تتعدي NlogN بالنسبة لجميع الحالات ولكن فى بعض الحالات الخاصة قد تصل ل N وهذا فى حالات خاصة جداً لذلك لا يمكن ان نعمم..

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

عمل برنامج لخوارزمية هو فقط تطبيق للخوارزمية, كما انه يمكنك ان تطبقها فى مواد اخرى مثل الميكانيكا و الروبوت وهندسة الطيران, كذلك يمكنك ان تطبقها فى الحاسوب, ولكن الاساس يبقى هو الاساس..

والسلام عليكم

ملاحظة.

اقراء تعريف الخوارزمية فى موقع ويكي, او ابحث فى جوجل عن تعريف معهى algorithm حتى تتضح لك الصورة..

تم تعديل هذه المشاركة بواسطة احمد غريب في 29 يونيو 2007 في 18:59 — السبب: إضافة ملاحظة

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#19
اقتباس
مكن خوارزمية بتحل مشكلة معينة وعند تطبيقها على مشكلة اخرى ما بتعطى النتائج المنتظرة

وهذا كلام دكاترة اخى bachirk ومن تواضع لله رفعة لانى رايتها رؤية العين فى دراستى فخذة منى عن ثقة ان شاء الله.

المشكلة التي نتحدث عنها هي مشكلة واحدة وهي ترتيب اعداد مبعثرة ولا توجد مشكلة اخرى

اما اذا كان تقصد اختلاف عدد الارقام يجعل المشكلة مختلفة فهذا شئ لم افهمه

انا قلت ان الفقاعية هي الاحسن ليس من ناحية الفعالية بل من ناحية الفكرة .

هل "من تواضع لله رفعه " نصيحة لي انا ان كانت كذلك سوف اخذ بها ان شاء الله

رغم اني لا اعرف سببها

ارجوا من الاعضاء ان لا يستعملوا كلمات مهينة مثل هراء و تافه .. الخ

لكي يكون الحوار ودي ونخرج منه بالفائدة ان شاء الله

تم تعديل هذه المشاركة بواسطة bachirk في 29 يونيو 2007 في 23:48

#20

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

على كل حال ما رأيكم بأخذ استراحة وزيارة هذا الرابط، وقولوا لي عن رأيكم..

/index.php?showtopic=131454

#21

اقتباس
اخى admir4-----"الحاجه للكود .. هي فهم الالجوريتيم بصوره اسهل" هذة عبارة خاطئة جدا

الكود بيمثلى المقارنة الحقيقية---ليس لتسهيل فهم الخوارزمية---لانك ما راح ترتب بيدك 100 عنصر--- لتعرف اى خوارزمية افضل-- وهذا اقل رقم ممكن يعطى.

يا عمي كل ما اردته هو كود من اجل تسهيل فهمي لفكره الالجوريتيم لاني وضعي صعب في العربي .. ولم افهم الالجوريتيم في صوره جيده ... افهمت قصدي الان !

اقتباس

اسرع خوارزمية لا تتعدي NlogN بالنسبة لجميع الحالات ولكن فى بعض الحالات الخاصة قد تصل ل N وهذا فى حالات خاصة جداً لذلك لا يمكن ان نعمم..

الجوزريتيم تصنيف ب

N

يا حلاوه ... انا عندما تعلمت الكورس بتاع الالجوريتمات اثبت لنا انه لا يمكن صتع شيء كهذا ...

ملاحظه: المقصود الجوريتيم تصنيف عام وليس حالات خاصه !

اقتباس
أو يمكن MIT كمان جامعة متخلفة في علوم الحاسب طبقا لكلام الأخ admirer4

انا ادرس في جامعه في اتفاقيات مع

MIT

ةتعلم هذا ولا اظن ان

IT

لا تدخل في هذه المواضيع

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

يا اخي بدل ان تحاول انكار وجود هذا العلم ... يجب ان تتهم جامعتكح بالاول سادعك مع الصور والملفات من كافه المواقع ...

http://www.personal.kent.edu/~rmuhamma/Alg...ortingIntro.htm

http://warp.povusers.org/SortComparison/integers_rep.html

http://www.cs.toronto.edu/~jepson/csc150/2006F/sorting.html

post-110964-1183198427_thumb.jpg

Writen By: Admirer4 , B.Sc Student of EE.

Learn C Programming Language

ِCowards die many times before their death

#22

أخ dr_abdalrhman شكرا جزيلا لك على هذا الإيضاح.. لقد لمعت فكرة في رأسي ولكن يجب التحقق منها لاحقا (مشغول قليلا الآن)، ماذا لو كان كل رقم يدخل إحدى السلسلتين (الأكبر والأصغر) تتم مقارنته مع ما هو موجود في السلسلة فورا (بطريقة تشبه Sort by Insertion) كفكرة أولية أظن أنها جيدة وتحسن استهلاك الذاكرة، الموضوع مطروح للتطوير، سأعمل على دراسة هذا الحل..

شكرأ

#23

هذه نتائج اختبار للخوارزمية، هي بالأساس تقوم بترتيب كلمات بشكل أبجدي.

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

ملف النتائج على الاكسل

sort.zip

#24

عذرا إن لم تكن النتائج واضحة..

Array Size حجم السلسلة التي أجريت عليها عملية الترتيب

Sorting Time الزمن المستغرق لإنجاز عملية الترتيب كاملة، بالميللي ثانية

Recursive Calls كم مرة تم استدعاء وظيفة Function الترتيب (أي بشكل عودي - تكراري) من أجل ترتيب السلسلة الأصلية، وبالتالي كم سلسلة فرعية تم إحداثها (بشكل تقريبي طبعا)

Total Comparisons عدد عمليات المقارنة (if Value1 > Value2) الكلية التي لزمت لترتيب السلسلة.

Time Per Element الزمن اللازم لترتيب عنصر واحد فقط من السلسلة الأم إلى ترتيبه النهائي (معدل وسطي)

Calls Per Element كم مرة تم استدعاء وظيفة Function الترتيب من أجل هذا عنصر واحد خلال مجمل العملية (معدل وسطي)

Comparisons Per Element كم عملية مقارنة تعرض لها أي عنصر من عناصر السلسلة الأم وصولا به للترتيب النهائي (وسطيا)

هذا الموضوع مغلق.

مواضيع مشابهة