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

Combination Of N element Algorithm

مغلق
بدأه عمرو عماد في 17 مارس 2007 · 28 رد · 4,022 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أولا لي رجاء في هذا المنتدي الغالي

لم أري مسابقات لعمل أو تصنيع ألجوريزمات والتحفيز علي حب الألجوريزم فهو مازال غامضا لكثيرا من الناس

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

ولكن الألجوريزم من المواضيع الهامة لأي مصمم برامج وهي أصل ما نحن فيه من برامج

رجائي هو إقامة مسابقة وليكن أسبوعية أو شهرية ويكون فيها الجوريزم موضوع ويطلب من الحل إما في 60 دقيقة كما رأيت في بعض المواقع أو في يوم أو كما تحددون حضراتكم

وإن كان الفكرة قد أعجبتكم

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

Gettime أي تعني سوف أحصل علي الوقت الحالي (هذا أفتراض)

أو أقول Split لتقسم نص معين ولا أتوغل في تفاصيل الدالة لأنها يمكن أن تختلف من لغة لأخري وهكذا

يمكن لبعض الأخوة الذين يملكون مهارات التعبير التوضيح أكثر ممني فأنا علي (قدي في التعبير ههه)

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

هيا نبدأ

أولا لدنيا الأعداد 1 و 2 و 3

ونريد إيجاد كل التوافيق الممكنة لهذه الأعداد الثلاثة

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

المهم

سوف نحصل علي

1

2

3

1 و 2

1 و 3

2 و 3

1 و 2 و 3

نجد أن هذه هي كل التوافيق الممكنة لهؤلاء الطلاب الثلاثة

ولكن هذا لا يعني أن 1 و 2 لا يساوي 2 و 1 فهذا غير منظقي في التوافيق

أي أنا أحمد وسيد هو هو سيد وأحمد

ثانيا المطلوب كتابة ألجوريزم للحصول علي هذه التوافيق ولكن لعدد غير محدود ولا تعرفه أثناء كتابة البرنامج يعني الرقم متغير أثناء تشغيل البرنامج

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

إن كان في طريق شرحي شئ غير مفهوم ابلغوني لأن أعيده بطريقة أخري

وفي النهاية لا تقلقكم فمعي الحل ولكن لم أحب وضعه لأجد حماس قوي

إن لم تعجبكم الفكرة فمن فضلك أحذف الموضوع سيدي المشرف

والسلام عليكم ورحمة الله وبركاته

#2

سلمت أخ عمرو على الفكره

بالنسبة الي أؤيد الفكره .. منها تفتيح للعقل .. وتشارك في الافكار .. ومعرفة كيف يفكر الاخر ..

فعلا كما ذكرت فهم الالجوريثمات من الشعب المهمه جدا في عالم البرمجة ..

ودمتم

#3

هناك اقتراح اخر

ارجو وضع الاسئلة الواردة في المسابقات العالمية

مثل topcoder imagincup

في مجال الخورزميات وارجوا ان تكون بالعربي

ويحاول الاعضاء المشاركة واقتراح الحلول

#4

بالنسبة لسؤالك حول التوافيق

اذا اردت استخراج كل التوافيق المكونة من k عدد

من مجموعة مكونة من n عدد

for i1=1 to n-k+1 do

for i2=i1 to n-k+2 do

for i3=i2 to n-k+3 do

for i4=i3 to n-k+4 do

.........

.........

.........

for ik=ih to n do

(i1,i2,i3,.....,ik)

حيث ih و h هي k-1

#5

فكرة رائعة رائعة

وجدة الحل

لاستخراج كل التوافيق المكونة من k عدد

______________________________________________

" حَافِظُوا عَلَى الصَّلَوَاتِ وَالصَّلاةِ الْوُسْطَى وَقُومُوا لِلَّهِ قَانِتِينَ "

______________________________________________

تحرير بواسطة 'بنهاشم منصوري'

#6

السلام عليكم

جزاك الله خيرا أ/ عمرو على الفكره الجميلة دى

الحقيقة الفكرة رائعة جدا، واهى فرصة لإنعاش التفكير شوية

على فكرة انا وجدت الحل ومستنى نلاقى طريقة لعرض الحلول

سلام

#7
عمرو عماد كتب:
إذا أحب أحد مشاركتي فمن فضلكم لا تضعوا الكود في هذه الصفحة بل إكتفي بكتابة كلمة توصلت لحل أو أنتهيت أو اي شئ من هذا القبيل لحين أن نجد طريقة للرفعها بحيث لا يستطيع أحد أن يراها إلا في نهاية المسابقة
bachirk كتب:
بالنسبة لسؤالك حول التوافيق

اذا اردت استخراج كل التوافيق المكونة من k عدد

من مجموعة مكونة من n عدد

for i1=1 to n-k+1 do

for i2=i1 to n-k+2 do

for i3=i2 to n-k+3 do

for i4=i3 to n-k+4 do

.........

.........

.........

for ik=ih to n do

(i1,i2,i3,.....,ik)

حيث ih و h هي k-1

#8
bachirk كتب:
بالنسبة لسؤالك حول التوافيق

اذا اردت استخراج كل التوافيق المكونة من k عدد

من مجموعة مكونة من n عدد

for i1=1 to n-k+1 do

for i2=i1 to n-k+2 do

for i3=i2 to n-k+3 do

for i4=i3 to n-k+4 do

.........

.........

.........

for ik=ih to n do

(i1,i2,i3,.....,ik)

حيث ih و h هي k-1

السلام عليكم

على فكرة الحل ده مش هو الألجوريزم المطلوب

سلام

#9

الحل هذا من اجل كل حالة جزئية يا عبقري

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

الطريقة لا تجعلك تبدو ذكي

ورحم الله رجلا عرف قدر نفسه

وشكرا

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

#10

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

لي عودة قريبا

تم تعديل هذه المشاركة بواسطة عمرو عماد في 29 مارس 2007 في 03:41

#11

السلام عليكم ورحمة الله وبركاته

أولا := أعتذر عن تأخري في كتابة ردي لكن والله ما أعطاني المنتدي أي رسائل تنبيه علي أن الموضوع تم فيه جديد

ثانيا : شكرا لمن قام بالرد علي موضوع وتأيد فكرة عمل مسابقة وشكرا لمن حاول إيجاد الحل سواء وفق أم لم

يوفق

الأخ bachirk لقد وضعت حلا منطقيا سليما في السرد لسهولة شرح الفكرة وهذه الفكرة رياضيا صالحة لما

ذكرت لكن اللغات البرمجية تحكمنا أحيانا بأن نتخلي عن مبادئنا الرياضية أو أنها تصعب كتابة الأفكار بالصيغة

الرياضية الموضوعة لذا نلجأ إلي حلولا أخري توافق كلا الطرفين الرياضيات ولغات البرمجة حتي نتمكن من إيجاد

أقصر الطرق أحيانا أو أقلها وقتا أو أقلها مساحة تخزينة في ذاكرة الكمبوتر أو أسرعها حلا إلي أخره من الحلول

والحالات التي يناقشها علم الألجوريزم

الأخ bachirk لقد فتحت مجالا لنقاش والتنافس الصالح لا لإستفزاز بعضنا البعض ولعل التنافس في العلم خير

تنافس هذا من وجهة نظري

أما الأخ العزيز Md_2007 فقد أصاب الرأي في أن هذا ليس الألجورزيم الذي يمكننا تطبيقه بلغات البرمجة

الفكرة ياأخي bachirk التي ذكرتها تكون صائبة إذا قمت بتثبيت العدد عند إنشاء البرنامج أي قبل الرن تيم

وما نقصده هنا هو وضع ألجوريزم يصلح لتغير أثناء الرن تين ويقوم بإيجاد التوافيق الممكنة لعدد متغير من العناصر

أخي hicham716 أني أتشوق لرؤية فكرتك ولكن نريد أن نحدد موعدا كل منا يضع كوده ليتم رؤيته من قبل

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

أما الأخ Md_2007 فيبدوا أنه قد أوجد حل خرافيا لأني أراه واثق من كلامه أوي لكن سوف نري قريبا إن شاء

الله

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

ويرينا إياه وسأبدا أن في ردي القادم بوضع ملفا تنفيذيا يوضح فكرتي لحين وضع الكود النهائي

والسلام عليكم ورحمة ورحمة الله وبركاته

#12

السلام عليكم

لقد وضعت ملفا تنفيذا يوضح فكرتي

Start تعني أنا التوافيق التي تتم تبدأ بيحث تكون عدد الأرقام المكونة لا تقل عن start

أما end فتعني أن أكبر عدد الأرقام المكونة لا تزيد عن end

يعني لو N=4

و start =2

و end =3

فيكون الناتج

12

13

14

23

24

34

123

124

134

234

أرجوا أن أكون قد أوضحت فكرتي

منتظر بقية الأفكار

Amr_Perm.rar

#13

فكرة ممتازة ولكن مالمقصود من هذه العملية ...

إخراج التوافيق الخاصة بعدة أرقام متفرقة مختلف عن فكرة إيجاد التوافق بالطريقة التي ذكرتها ؟؟؟

لم أفهم وجهة نظرك ...

#14

الحل وضعته في هذا الاختصار

undefined

#15

أخي إبراهيم بخش ربما لا أستطيع أيضاح الفكرة بالشكل السليم لكن كتب علي قدر إستطاعتي وسأعيد لك سرد الفكرة بطريقة أخري

نفرض أنا لدينا فصل مكون من عشرة طلاب مثلا ونعطي كل واحدا منه رقما من 1 إلي عشرة

بحيث أنا أحمد هو الرقم 1 وسيد هو الرقم 2 وهكذا إلي أن نتم بقية التلاميذ

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

وبهذه الطريقة إذا تمت يستطيع المشرف تحديد أقل عدد طلاب تمثل مجموعة ذات كفائة لدخول المسابقة

هذه طريقة لشرح

طريقة أخري لو نفرض أن لديك مصفوفة ذات أبعاد مختلفة وليكن 10 × 10 وتريد إيجاد عدد الصفوف التي مجموعها تكافئ الواحد مثلا فهذا يتطلب منك أن توجد تبديلات بين هذه الصفوف لإيجاد أقل حل ممكن من الصفوف لإيجاد الحل المكافئ وهذه الطرق تقريبا تخص اللوجيكال ديزين

أرجوا أن أكون قد أوضحت فسأعطيك الأن مثالا عدديا لتوضيح أكثر

نفرض أن لدينا ثلاثة طلاب وأرقامهم مثلا 1 و 2 و 3

فتكون المجموعات التي يتم إنشائها من هؤلاء الطلاب

1- المجموعات الفردية

1

2

3

2-المجموعات الزوجية

12

13

23

3- المجموعات الثلاثية

123

وبذلك نكون قد أوجدا عدد التوافيق أو المجموعات الممكنة من الطلاب وبعد مثلا نري أيا هذه المجموعات ذات كفائة عالية وندرس كل مجموعة علي حدة (هذا فرد مثلا)

أرجو أن أكون قد وضحت فكرتي أخر إبراهيم بخش

أما المثال الذي وضعته صممته بحيث أن تتحكم بالعدد المكون للمجوعات

أخي bachrik لقد إتبعت الرابط التي وضعته ولكن تلك خوارزمية وهذه خورازمية أخري حيث أنني لم أتمكن من قراءة الألجوزريزم الذي وضعته كاملا ولكن سأقرأه حين أعود من العمل إن شاء الله

أنا لا أقصد مجموع الأعدادP من بين N عددا التي تساوي قيمة معينة S

لكنها بصراحة ألجوريزم رائع سوف أحاول التفكير في حل أخر غير حلك وأضعه لأنها أعجبتني حقا إن شاء الله

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

أسف للإطالة ولي عودة إن شاء الله مساء اليوم

السلام عليكم

#16

السلام عليكم

اولا بالنسبة للرابط الذي وضعته

هو خوارزمية تعرض كل المجموعات المكونة من p فرد من مجموعة كلية تحوي n فرد وليس لها علاقة بالمجموع s

وتستطيع فيه وضع المدخلات بعد التنفيذ.

اي انها حل جزئي للمشكل الذي طرحته اذ بامكانك ان تغير قيمة p وتعطيها القيم من 1 الى n

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

وانا اريد منك طلب انت او احد الاصدقاء الذين يجيدون الانجليزية ان يضعوا الاسئلة الواردة في المسابقات العالمية

في الخورزميات مثل topcoder. imagincub . وتكون الاسئلة مترجمة بالعربية

وبالمناسبة اعتذر للاخ Md_2007

واتمنى ان تكون طريقة الرد في المرات القادمة لا تحوي اي استخفاف بطريقة تفكير الاخريين

وشكرا

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

#17

الاخ عمرو عماد مشكور على اهتمامك

انا وجدة الحل لكن ارجو ان تجيبني على هذا السؤال قبل طرح الاجوبة

اقتباس
ثانيا المطلوب كتابة ألجوريزم للحصول علي هذه التوافيق ولكن لعدد غير محدود ولا تعرفه أثناء كتابة البرنامج يعني الرقم متغير أثناء تشغيل البرنامج

طريقة ادخال هذا العدد غير المحدود؟

مثلا اذا كانت لدينا 10 اعدد؟ او اكثر

انا اخدة الاعداد من 1 الى k اي في حالة 10

الاعداد هي 1 2 3 4 5 6 7 8 9 10

هل هكذا ام ما هي طريقة ادخال هذا العدد غير المحدود؟

______________________________________________

" حَافِظُوا عَلَى الصَّلَوَاتِ وَالصَّلاةِ الْوُسْطَى وَقُومُوا لِلَّهِ قَانِتِينَ "

______________________________________________

تحرير بواسطة 'بنهاشم منصوري'

#18

الحل

تحتاج Command1 text1 grid1

تحت الحدث click ل Command1 نكتب الكود الأتي

(الحل جاهز بالمرفقات)

Private Sub Command1_Click()
Grid1.Clear
k = Val(Text1)
l = 0
r = 2 ^ k - 1
Q = 2 ^ k
f = 0
For e = 1 To Val(k)
Q = Val(Q) / 2
f = f + 1
For t = Val(Q) To 1 Step -1
Grid1.Col = 0
Grid1.Row = l
Grid1.Text = " " & "(" & Val(f) & ")"
l = l + 1
Grid1.AddItem ""
Next t
Next e
r = Val(r) - 1
For i = 1 To (k - 1)
f = 2 ^ i - 1
j = 0
For a = f To (2 * f - 1)
Grid1.Row = (r - j)
s = Grid1.Text
Grid1.Row = (r - a)
Grid1.Text = Grid1.Text & "" & s
j = j + 1
Next a
Next i
End Sub

Algorithme.zip

______________________________________________

" حَافِظُوا عَلَى الصَّلَوَاتِ وَالصَّلاةِ الْوُسْطَى وَقُومُوا لِلَّهِ قَانِتِينَ "

______________________________________________

تحرير بواسطة 'بنهاشم منصوري'

#19

السلام عليكم

bachirk كتب:
وبالمناسبة اعتذر للاخ Md_2007

واتمنى ان تكون طريقة الرد في المرات القادمة لا تحوي اي استخفاف بطريقة تفكير الاخريين

وشكرا

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

لكنى فعلاَ لم أقصد ذللك أبداَ

وعلى العموم حصل خير

عمرو عماد كتب:
أما الأخ Md_2007 فيبدوا أنه قد أوجد حل خرافيا لأني أراه واثق من كلامه أوي لكن سوف نري قريبا إن شاء الله

لا هو خرافى ولا حاجة

انا وجدت حلين

الحل الاول بسيط جدا استخدمت فيه Divide and Conquer Technique

بس المشكلة فيه انه شغال بال Recursion لذللك كلما زاد الرقم (N) كلما اخذ وقت اكبر و مساحة اكبر

وممكن يعمل stack over flow

اما الحل الثانى فكرته احسن شوية وبأخذ وقت ومساحة اقل بكتير

مرفق مع الرسالة ملف تنفيذى للحل الثانى

سلام

2nd_solution.rar

#20

السلام عليكم ورحمة الله وبركاته

اسف جدا لقلة مشاركاتي في الموضوع لكن أحيانا بسبب العمل أو بسبب الإرهاق أو بسبب أن زهني غير صافي هذه الايام فأعذروني لكني والله متحمس جدا لأن أقوم بمشاركة في مسابقات الألجورزيم

المهم يبدا أن الموضوع عليه إقبال وحماس رائعين

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

bachirk كتب:
وانا اريد منك طلب انت او احد الاصدقاء الذين يجيدون الانجليزية ان يضعوا الاسئلة الواردة في المسابقات العالمية

في الخورزميات مثل topcoder. imagincub . وتكون الاسئلة مترجمة بالعربية

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

hicham716 كتب:
طريقة ادخال هذا العدد غير المحدود؟

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

أخي 'hicham716' لقد وضعت حلا رائعا وجميلا وبسيطا لكنك إعتمدت علي ما تقوم بتخزينه في الجريد ليست ثم تولد منه بقية التوافيق لكن حلك من وجه نظري رائعا لكنه للوهلة الأولي لنظر إليه يري القارئ أنه معقد من كثرة المتغيرات التي إستخدمتها

أخي والله أنا لا أقصد شئ لكن لقد قلت لك أنا لست مؤهلا لأن أقول هل هذا جيد أم لا بل أن أتكلم عما أراه معلشي تعبير علي قدي بحاول والله أني أكتب

وأخي Md_2007 شكرا لتعاونك معانا بإبداء رأيك ووضعك للبرنامج الذي مازال غامضا عما يحوية ولكن أعتقد أنك سوف تكون أروعنا حلا لهذه المشكلة

الأن سوف أقوم بسرد فكرتي ثم أضع الكود في المرفقا ت

لقد قمت بإنشاء ثلاثة مصفوفات A و B و C

المصفوفة A تحمل الأعداد المراد إيجاد التوافيق بينهم وطولها N عنصرا

والمصفوفة B تحمل رقما بدايا من 1 إلي N ولكن بالنظام الثنائي للأعداد وطولها N عنصرا

والمصفوفة C تحمل حاصل ضرب المصفوفة A و B وطولها N عنصرا

في الخطوة الأول أقوم بلمئ المصفوفة B بالعدد الثنائي المقابل للرقم 1

بحيث أن أضع الواحد في أول Index في المصفوفة والباقي أقوم بملئه بالعدد صفر لا أن الصفر في الشمال ليس له معني

ثم أقوم بضرب محتويات المصفوفة A في محتويات المصفوفة B وأضع الناتج في المصفوفة C

ثم الخطوة الثانية أقوم بالحصول علي العدد الثنائي المقابل للعدد العشري 2 وهو بدور يلي العدد 1 ثم أقوم بإجراء ما قمت بعمله سابقا

وأقوم بتكرار الخطوات إلي أن أصل إلي العدد(2^N ) - واحد هذه هي عدد التوافيق الممكنة

 Dim N As Integer
 Dim I As Double
 Dim st As String
 Dim B() As Integer  
 Dim C() As Integer
 Dim Count As Integer  
N = UBound(A) 
ReDim B(1 To N)  
ReDim C(1 To N)
I = 1
  Do Until I > 2 ^ N - 1

  'هذه الدالة فرعية لكل واحد منا له طريقة في كتابتها لكني لم أكتب إلا  الألجوريزم المطلوب	
  DecToBin B, N	st = ""
   Count = 0	For j = 1 To N	 
	C(j) = A(j) * B(j)
	 If C(j) <> 0 Then
		If st = "" Then
		  st = C(j)
		Else
		 st = st &  " & " &  C(j)
		End If
	  End If
	Next
	DoEvents
	I = I + 1
  Loop

ها هو كودي وهو عبارة عن حلقتين متادخلتين الأم تدور بعدد التوافيق المطلوبة والثانية داخلها تدور N مرة

ياريت يا أخي Md_2007 أدرج كودك

وعايزين بقي ناس تقيم هههههههه عشان أنا مش هاعرف أنا قمت بشرح فكرتي ووضع برنامجي في المرفقات

أرجوا أن تعجبكم

Permutation.rar

تم تعديل هذه المشاركة بواسطة عمرو عماد في 30 مارس 2007 في 19:57

#21

السلام عليكم ورحمة الله وبركاته

عيد سعيد

ولد الهدى فالكائنات ضياء ****** وفم الزمان تبسم وثناء

اقتباس
أخي والله أنا لا أقصد شئ لكن لقد قلت لك أنا لست مؤهلا لأن أقول هل هذا جيد أم لا بل أن أتكلم عما أراه معلشي تعبير علي قدي بحاول والله أني أكتب

أنا أود أن أوجه دعوى للجميع

1

يجب علينا جميعا أن نعتمد فلسفة الوضوح وإظهار عيوب الحلول المقترحة حتى نصل إلى الهدف الذي نتوخاه من وراء هذه المسابقة

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

2

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

اقتباس
لقد قمت بإنشاء ثلاثة مصفوفات A و B و C

المصفوفة A تحمل الأعداد المراد إيجاد التوافيق بينهم وطولها N عنصرا

والمصفوفة B تحمل رقما بدايا من 1 إلي N ولكن بالنظام الثنائي للأعداد وطولها N عنصرا

والمصفوفة C تحمل حاصل ضرب المصفوفة A و B وطولها N عنصرا

في الخطوة الأول أقوم بلمئ المصفوفة B بالعدد الثنائي المقابل للرقم 1

بحيث أن أضع الواحد في أول Index في المصفوفة والباقي أقوم بملئه بالعدد صفر لا أن الصفر في الشمال ليس له معني

ثم أقوم بضرب محتويات المصفوفة A في محتويات المصفوفة B وأضع الناتج في المصفوفة C

ثم الخطوة الثانية أقوم بالحصول علي العدد الثنائي المقابل للعدد العشري 2 وهو بدور يلي العدد 1 ثم أقوم بإجراء ما قمت بعمله سابقا

وأقوم بتكرار الخطوات إلي أن أصل إلي العدد(2^N ) - واحد هذه هي عدد التوافيق الممكنة

أنا قمة بمحاولة بسيطة واعتذر لعدم توضيحها عند طرح الحل

الفكرة أتت من ملاحظة لاحظتها وهي مبينة في الصورة الموجودة بالمرفقات وضعتها هناك لآني لم اعرف كيف أضعها مباشرة تحت الكتابة

استسمح على الإطالة

محمد سيد الكونين والثقليــــن ****** والفريقين من عُرْب ومنْ عجــمِ

نبينا الآمرُ الناهي فلا أحــــدٌ ****** أبرَّ في قولِ لا منه ولا نعــــمِ

هو الحبيب الذي ترجى شفاعـته ****** لكل هولٍ من الأهوال مقتحـــمِ

دعا إلى الله فالمستمسكون بــه ****** مستمسكون بحبلٍ غير منفصـــمِ

post-106443-1175284958_thumb.jpg

______________________________________________

" حَافِظُوا عَلَى الصَّلَوَاتِ وَالصَّلاةِ الْوُسْطَى وَقُومُوا لِلَّهِ قَانِتِينَ "

______________________________________________

تحرير بواسطة 'بنهاشم منصوري'

#22
عمرو عماد كتب:
وأخي Md_2007 شكرا لتعاونك معانا بإبداء رأيك ووضعك للبرنامج الذي مازال غامضا عما يحوية ولكن أعتقد أنك سوف تكون

أروعنا حلا لهذه المشكلة

الأن سوف أقوم بسرد فكرتي ثم أضع الكود في المرفقا ت

لقد قمت بإنشاء ثلاثة مصفوفات A و B و C

المصفوفة A تحمل الأعداد المراد إيجاد التوافيق بينهم وطولها N عنصرا

والمصفوفة B تحمل رقما بدايا من 1 إلي N ولكن بالنظام الثنائي للأعداد وطولها N عنصرا

والمصفوفة C تحمل حاصل ضرب المصفوفة A و B وطولها N عنصرا

في الخطوة الأول أقوم بلمئ المصفوفة B بالعدد الثنائي المقابل للرقم 1

بحيث أن أضع الواحد في أول Index في المصفوفة والباقي أقوم بملئه بالعدد صفر لا أن الصفر في الشمال ليس له معني

ثم أقوم بضرب محتويات المصفوفة A في محتويات المصفوفة B وأضع الناتج في المصفوفة C

ثم الخطوة الثانية أقوم بالحصول علي العدد الثنائي المقابل للعدد العشري 2 وهو بدور يلي العدد 1 ثم أقوم بإجراء ما قمت بعمله سابقا

وأقوم بتكرار الخطوات إلي أن أصل إلي العدد(2^N ) - واحد هذه هي عدد التوافيق الممكنة

ياريت يا أخي Md_2007 أدرج كودك

وعايزين بقي ناس تقيم هههههههه عشان أنا مش هاعرف أنا قمت بشرح فكرتي ووضع برنامجي في المرفقات

أرجوا أن تعجبكم

السلام عليكم

شكرا اخى عمرو، الحقيقة فكرتك رائعة حقا ولكنها بتأخذ وقت طويل مع الاعداد الكبيرة الاوردر هو O() = 2^N

اما بالنسبة لحلى انا فكرت فى المشكلة انى عاوز اقسم ارقام(عددها N ) الى عدد من المجموعات بكل التوافيق الممكنة

و عدد المجموعات تلك تساوى NCR حيث R = 1,2,3,4,.... N

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

باستخدم فيه N مصفوفة وهو يعمل كما يلى:

1- اول مصفوفة بها 1، 1 --> 1C0 , 1C1

2- بأبدأ من اول المصفوفة الثانية إلى الاخيرة وامش من الشمال إلى اليمين، كل عنصر هو عبارة عن مجموع العنصرين اللى فوقه

واللى قبل اللى فوقه

ولنأخد الرقم 6 على سبيل المثال

thumb.jpg

وهناك طريقة اخرى لتنفيذ هذا الالجوريزم بمصفوفتين فقط (وهذا هو ما أستخدمته)

المهم نرجع للألجوريزم الاساسى

انا معتمد فيه على مصفوفتين

الاولى هى مصفوفة البداية وطولها N وتحتوى على الارقام من 1 إلى N

والثانية هى مصفوفة طولها NCR وتحتوى على كل التوافيق الممكنة والتى لها طول R(فى البداية R = 0 وتكون المصفوفتان متساويتان)

فى كل خطوة بأعمل الاتى

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

وبعد كل خطوة اطبع مصفوفة الحل وبعد كده اخلى المصفوفة الحالية = مصفوفة الحل

واكرر هذه العملية N-1 مرة

لذلك الاوردر بتاع الحل هو N وأضاَ تجد ان الحل مرتب أول حاجة الارقام فرادى وبعد كده كل الازواج الممكنة وهكذا ....

ولنأخد الرقم 4 على سبيل المثال

thumb.jpg

هذا هو المودل

class Combination
	{
		private int size;
		private String[] start;
		private int[] combination;
		private View view;

		/// <summary>
		/// initialize the start arrray with the nimeric values "1","2","3", ... "size+1"
		/// </summary>
		/// <param name="size"> size the size of the start array</param>
		private void init(int size)
		{
			this.size = size;
			this.start = new String[size];
			for (int i = 0; i < size; i++)
				this.start = (i + 1).ToString();
		}


		/// <summary>
		/// calculate on row in the ....
		/// </summary>
		/// <param name="previous">the previous row</param>
		/// <param name="size">size of the previous row</param>
		/// <returns> the new row contain NCR for R = 0,1,2,.... ,N</returns>
		private int[] calculateCombination(int[] previous, int size)
		{
			int[] current = new int[size + 1];
			current[0] = 1;
			current[size] = 1;
			for (int i = 1; i < size; i++)
			{
				current = previous[i - 1] + previous;
			}
			return current;
		}
		/// <summary>
		/// calculate the combination of the size(N) for every R = 0,1,2,...
		/// </summary>
		private void calculateBoundes()
		{
			int[] start = { 1, 1 };
			for (int j = 1; j < size; j++)
			{
				start = calculateCombination(start, j + 1);
				//start = current;
			}
			combination = start;
		}
		/// <summary>
		/// generate the combination of length r numbers(1 to size)
		/// </summary>
		/// <param name="current">the previous solution</param>
		/// <param name="bound">the length of the combination</param>
		/// <returns>the current solution</returns>
		private String[] generateCombination(String[] previous, int r)
		{
			int solutoinSize = combination[r];
			int previousSize = previous.Length;
			int size = this.size - r + 1;
			String[] solution = new String[solutoinSize];
			int index = 0;
			for (int i = 0; i < size; i++)
			{
				int j = 0;
				while (previous[j].StartsWith(start) == false)
					j++;
				while (previous[j].StartsWith(start))
					j++;
				for (; j < previousSize; j++)
					solution[index++] = start + "-" + previous[j];
			}
			return solution;
		}
		/// <summary>
		/// print the content of an array of strings
		/// </summary>
		/// <param name="solution">the arrary to be printed</param>
		private void printSolution(String[] solution)
		{
			view.print(solution);
			view.refreshView();
		}
		/// <summary>
		/// run the program given the size
		/// </summary>
		/// <param name="size"> the size of the start array</param>
		public void run(int size, View view)
		{
			init(size);
			this.view = view;
			calculateBoundes();
			String[] current = this.start;
			//print the first solution
			printSolution(current);
			for (int i = 0; i < size - 1; i++)
			{
				//get the current solution
				current = generateCombination(current, i + 2);
				//print the current solution
				printSolution(current);
			}
		}
	}

ومرفق بالرسالة الكود بالكامل( C# .NET 2005)

آسف انى طولت عليكم

سلام

combination.rar

#23

السلام عليكم ورحمة الله وبركاته

الألجوريزم وطرق حلول المشاكل تبدوا للوهلة الأولي لقارئها كأنها معقدة وأنها لا تفيد شئ مادام هناك حلا أسهل للفهم

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

فلو أخذنا مثلا علي أبسط الألجورزيما مثل ترتيب مجموعة من الأعداد سواء تصاعديا أو تنازليا Sorting Alogrithm أنا قد درستها في الكلية وأعجب لمن فكر في هذه الطرق كيف توصلوا إليها أي عقل بشري وراء هذه الخدع السحرية نعم أقول خدع سحرية هههه فمثلا من أعجب الألجوريزمات التي رأيتها في ترتيب الأعداد هي Binary tree حيث إستخدمها واضع الطريقة في ترتيب الأعداد أو مثلا الأكثر تعقدا منه وهو Heap sort

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

والله يا أخي طريقتك رائعة جدا وجميلة أعجبتي وإن شاء الله أحفظها عن ظهر قلب ولن أنساها ههههه أوعي تفتكر ببالغ لا والله فهي الحقيقة فأنا أحب اللألعاب السحرية ههههه

أخي Hicham إلي الأن لم أفهم طريقتك اي أسلوبا إتخذت من فضلك لو تكرمت بإيضاح فكرتك حتي أقوم بالتعليق عليها

ولا بد أن تضع تعليقا علي ألجوريزم الأخ Md_2007 حتي نحكم علي أنفسنا ههههههه

منتظر ردودكم حتي نستكمل مسابقاتنا في صمت هههههه

أسف للإطالة وأسف إن كان هناك خطأ في ردي

#24

السلام عليكم و رحمة الله

الأخ Md_2007 طرحت فكرة رائعة بكل صراحة أنا فهمة الفكرة لكن الكود المرفق لم استطع تشغيله.

وكلاكما الحقيقة وضعتم حلول رياضية قيمة.

اما أنا فوضعت حل تقليدي وبسيط و اعتقدت انه واضح لذالك لم اطل في شرحه. التمرين القادم إن شاء سأضع حلا في المستوى.

اقرأ بتوازي مع الصورة المرفقة

أنا أخذت مصفوفة S0 تحتوي على الأرقام من 1 إلى N

1) المصفوفة S1 يوجد بها

العدد الأول بتكرار 2^(N-1) مرة

العدد الثاني بتكرار 2^(N-2) مرة

العدد الثالث بتكرار 2^(N-3) مرة

وهكذا إلى غاية N

2) المصفوفة S2 هي نفسها S1 فقط عدد الصف الأخير أضيف إلى الصف الذي قبله

3) المصفوفة S3 هي نفسها S2 فقط أعداد الصفوف الثلاثة الأخيرة أضيفة إلى الصفوف التي قبلها

4) المصفوفة S4 هي نفسها S3 فقط أعداد الصفوف السبعة الأخيرة أضيفة إلى الصفوف التي قبلها

أي دائما (2 ^ i – 1) صفا الأخيرة أضيفها إلى الصفوف التي قبلها

post-106443-1175435013_thumb.jpg

______________________________________________

" حَافِظُوا عَلَى الصَّلَوَاتِ وَالصَّلاةِ الْوُسْطَى وَقُومُوا لِلَّهِ قَانِتِينَ "

______________________________________________

تحرير بواسطة 'بنهاشم منصوري'

#25

شكرا لك أخي hicham لشرح فكرتك بارك الله فيك

الأن لدينا ثلاثة خوارزميات لحل مشكلة التوافيق

خوارزمية عمرو عماد

خوارزمية Md_2007

وخورازمية Hicham716

في الرأي الشخص ومعذرة لمن ساهم بوضع الخوارزميات

أن أفضلنا حلا هو الأخ Md_2007 وأرجوا أن أكون بغير مخطئ فحله سهل ورائع وأقل وقت

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

وأعذروني والله هذه الأيام لا أقوي علي التفكير ولا حتي التركيز فهذا هو سبب عدم تعليقي تفصيليا علي كل خوارزمية لكن إن شاء الله أحاول حين أستعيد قواي في مناقشتها واحدة تلو الأخري

وللعلم هههه لقد قمت أمس بقراءة سيعة وأربعون صفحة من الموضوع الهائل لغز إينشتاين ولا أقوي حتي علي التفكير في واحدة فما يبدوا وهو الأوضح أني ظهرت من 98 بالمائة التي تكلم عليها الأخ ههههههه لم أحل ولا لغز في هذه الصفحات (حبيت أهزر بس)

المهم سأحاول البحث عن ألجوريزم معقد ولكن ساعدوني لنقوم بوضعه هنا والتفكير فيه وإيجاد حلولا له

وأسف للإطالة والسلام عليكم ورحمة الله وبركاته

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

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