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

[تنبيه - عنوان غير مناسب : ]مشكله فى كود هذا الالجوريزم ؟؟

بدأه The expendable في 13 نوفمبر 2010 · 22 رد · 1,736 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

هذا الكود لألجوريزم يشابه نظام البحث الثنائى ولكنه معدل على نحو

انه يقوم بتقسيم المصفوفه الى ثلاثه اجزاء و ليس اثنان ومن ثم يقوم بالبحث عن العنصر فيهم

ولكن المشكله انه بيجيب اول 3 عناصر صح !! والباقى لما ابحث عنهم يطلع out of bounds Exception

الكود مرفق

وشكرا مقدما..

TribleSearch.java

تم تعديل هذه المشاركة بواسطة The expendable في 14 نوفمبر 2010 في 00:35

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#2

سوالك غير مفهوم

لان انا لم شغلت الكود طلع لى

Target found at index :  2

وانهى البرنامج وخلاص

فين بقا مشكله الـout of bounds Exception

Software Developer
Mahmoudkelany.com


 

#3

[

اقتباس
ولكن المشكله انه بيجيب اول 3 عناصر صح !! والباقى لما ابحث عنهم يطلع out of bounds Exception

تم تعديل هذه المشاركة بواسطة The expendable في 13 نوفمبر 2010 في 17:23

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#4

براحه عليا يا بشمهندس

Software Developer
Mahmoudkelany.com


 

#5

اين الردود .. هل اعتاد المحترفون على الاسئله السهله ... تم رفع نقاط السؤال الى 7

انا عملت تراس ولكن لا اعرف اين المشكله

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#6

بالرغم من أن الBinary أفضل من حيث عدد المقارنات أقل بكثير ،، لكن التعديل هو في المؤشر الثاني حيث يحصل overflow فيه (قيمته أكبر من المصفوفه) لذلك لا تضربه ف 2 مع المؤشر الأول، ولكن اجعله بعد المؤشر الأول:

second_Third = (first+last)/2

أيضاً عليك بوضع شرط للأعداد غير الموجودة في المصفوفة:

if ( second_Third >= last )
	return -1;

التعديل:

public static int mySearch(int[] arr,int first ,int last)
    {
        if(first > last)
            return -1;
        int first_Third  = (first+last)/3 ,second_Third = (first+last)/2;

		if ( second_Third >= last )
			return -1;

        if(arr[first_Third] == target)
            return first_Third;
        else if(arr[second_Third] == target)
            return second_Third;
        else if(target < arr[first_Third])
            return mySearch(arr,first,first_Third-1);
        else if(target > arr[first_Third] && target < arr[second_Third])
            return mySearch(arr,first_Third+1,second_Third-1);
        else
            return mySearch(arr,second_Third+1,last);
    }

بالتوفيق،

1

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#7

بارك الله فيك ولكن مازالت هناك مشاكل فعندما جربت الداله على هذه المصفوفه

	public static void main(String[] args)
	{
    	//target =3;
    	int ar[] = {1,2,3,4,5,6,7,8};
    	int target_Index = mySearch(ar,0,(ar.length));

    	System.out.println("Target found at index :  "+target_Index);

	}

عندما ابحث عن 2 او 4 او 5 او 6 يطلع -1 مع ان الباقى بيطلع الاندكس مظبوط

Wajdy Essam كتب:

بالرغم من أن الBinary أفضل من حيث عدد المقارنات أقل بكثير ،، لكن التعديل هو في المؤشر الثاني حيث يحصل overflow فيه (قيمته أكبر من المصفوفه) لذلك لا تضربه ف 2 مع المؤشر الأول، ولكن اجعله بعد المؤشر الأول:

second_Third = (first+last)/2

ايضا هنا انا اريد ان ان اقسم المصفوفه الى ثلاثه اجزاء فجعلت المؤشى الثانى ضعف الاول الذى هو الثلث الأول

فبالتالى اكون حصلت على مؤشر للثلثين ولكن عندما عملت تراس وجدت ان الاكسبشن هنا ولكن مازلت لا اعرف لماذا

وشكرا مقدما

تم تعديل هذه المشاركة بواسطة The expendable في 14 نوفمبر 2010 في 01:49

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#8

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

هو فعلا الغلطة عندك كانت فى ال algorithm نفسة

و الكود اللى كتبة الاخ Wajdy شغال تمام مع كل الارقام فعلا happy.gif

معلش انا مليش اوى فى ال algorithms علشان اقدر احل البرنامج انا لسة مبتدا

بس انا لحد دلوقتى مش فاهم ال algorithm اللى استخدمتة يا Wajdy وبعدين هو لما يكون ال

second_Third = (first + last) / 2;

كدة ال array مش هيبقى متقسم ل 3 اجزاء بالتساوى ؟

ياريت تفهمنا ال algorithm

يلا سلام

تم تعديل هذه المشاركة بواسطة NarutoMan في 14 نوفمبر 2010 في 01:56

1 −1
#9
NarutoMan كتب:

هو فعلا الغلطة عندك كانت فى ال algorithm نفسه

و الكود اللى كتبة الاخ Wajdy شغال تمام مع كل الارقام فعلا happy.gif

هل جربته مع كل الارقام فعلا ؟؟ blink.gifblink.gif لا اظن .. جربه مع المصفوفه السابقه التى وضعتها وابحث عن الرقم 4 مثلا

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#10
اقتباس
أيضاً عليك بوضع شرط للأعداد غير الموجودة في المصفوفة:

expand | plain text

if ( second_Third >= last )

return -1;

اولا :

الشرط الاول للتأكد من ان الأراى مازال ممتلا لأنه المؤشر first يتم ارساله الى الداله فى كل مره اما second_Third قليس له دخل هنا على ما اعتقد .

ثانيا :

يجب انا اقوم بتقسيم المصفوفه الى ثلاثه اجزاء و لكن المؤشر الثانى يشير للمنتصف وانا اريده يشير الى الثلثين

بارك الله فيك يا اخ وجدى و زادك علما تنفع به الناس ..

ولكن بدون ان نحل مشكله المؤشر الثانى هذا يعتبر تحايل على الحل ph34r.gif

تم تعديل هذه المشاركة بواسطة The expendable في 14 نوفمبر 2010 في 02:32

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#11

كما اشار الاخ وجدى - Binary Search معروفة اكثر لكن هذه الطريقة ستقلل من عدد الاستدعائات الذاتية - على كل حال الاخطاء فى الالجوريسم اخطاء حسابية.

اولا - طريقة حساب المؤشر خاطئة لانك تعتمد على Last على انها مؤشر لنهاية المصفوفة الفرعية (sub array) لذا كان المطلوب تحديد المكان فى المصفوفة الفرعية و ليست المصفوفة نفسها:


double sub_range = (last - first) / 3;
int first_Third = (int) (sub_range + first) ,second_Third = (int) (2* sub_range + first);

ثانيا - كود التحقق خاطئ لان Last ليست حجم المصفوفة الفعلية


int array_len = arr.length;
if ( second_Third >= array_len )
return -1;

التعديل:


public static int mySearch(int[] arr,int first ,int last)
{
if(first > last)
return -1;

int array_len = arr.length;
double sub_range = (last - first) / 3;
int first_Third = (int) (sub_range + first) ,second_Third = (int) (2* sub_range + first);

if ( second_Third >= array_len )
return -1;

if(arr[first_Third] == target)
return first_Third;
else if(arr[second_Third] == target)
return second_Third;
else if(target < arr[first_Third])
return mySearch(arr,first,first_Third-1);
else if(target > arr[first_Third] && target < arr[second_Third])
return mySearch(arr,first_Third+1,second_Third-1);
else
return mySearch(arr,second_Third+1,last);
}

بالتوفيق و السلام ختام

تم تعديل هذه المشاركة بواسطة Ahmedvc في 14 نوفمبر 2010 في 09:04

2
#12

بارك الله فيك ولك وبك+10 ... تفكير منطقى لأن المؤشرات كانت فاسده ..

وباستخدام الطريقه التقليديه الورقه والقلم طريقتك مظبوطه 100%

وبكده نكون اكتشفنا عقليه جيده اخرى معنا فى الفريق العربى ..036.gif

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

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#13

الأخ الكريم/الأخت الكريمة

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

مرحباً بكم في منتدى الفريق العربي للبرمجة

نود تنبيهك أن العنوان غير مناسب.

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

وفي حال التكرار سيتعرض موضوعك للإغلاق والحذف!!!

قواعد المشاركة

/index.php?showtopic=29343

شاكرين لكم حُسن تعاونكم

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#14

بارك الله فيك يا اخى علاء ولكنى لم اجد عنوان انسب ..

و كنت ايضا اود ان تعلق على الالجوريزم وعن مدى كفاءته

كما علقت على العنوان للاستفاده من نظرتك الخبيره

ولكم جزيل الشكر .

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#15

يا عينى على الناس اللى بتكتب algorithms ربنا يوعدنا

الصراحة 100%

#16

لدي قانوني الغير مكتوب :)

لا أقوم بتنزيل أية مرفقات ما لم أجد أني غير قادر بالقراءة أن أحل المشكلة

وفي حالتك أنت لم تضع الشيفرة للقراءة وإنما وضعت التحميل فقط :)

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#17
علاء الصالحي كتب:

لدي قانوني الغير مكتوب :)

لا أقوم بتنزيل أية مرفقات ما لم أجد أني غير قادر بالقراءة أن أحل المشكلة

وفي حالتك أنت لم تضع الشيفرة للقراءة وإنما وضعت التحميل فقط :)

تحياتي

تم وضع الكود ...

ارجو افادتك

public class TribleSearch {
	public static int target =3;
	public static int mySearch(int[] arr,int first ,int last)
	{
    	if(first > last)
        	return -1;
    	int first_Third  = (first+last)/3 ,second_Third = 2*first_Third;
    	if(arr[first_Third] == target)
        	return first_Third;
    	else if(arr[second_Third] == target)
        	return second_Third;
    	else if(target < arr[first_Third])
        	return mySearch(arr,first,first_Third-1);
    	else if(target > arr[first_Third] && target < arr[second_Third])
        	return mySearch(arr,first_Third+1,second_Third-1);
    	else
        	return mySearch(arr,second_Third+1,last);
	}

	public static void main(String[] args)
	{
    	//target =3;
    	int ar[] = {1,2,3,4,5,6,7,8};
    	int target_Index = mySearch(ar,0,(ar.length));

    	System.out.println("Target found at index :  "+target_Index);

	}

}

تم تعديل هذه المشاركة بواسطة The expendable في 15 نوفمبر 2010 في 13:05

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#18

ما المشكلة التي تواجهها بالضبط؟

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

حيث أنك لم توجد حلاً لهذه النقطة

عن اقتراحات لحل هذه المشكلة يهيألي أنه لا فائدة حقيقية من تغيير خوارزمية البحث الثنائي إلى الثلاثي

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19

المشكله مذكوره فى الاعلى وعندما تبحث عن عنصر غير موجود يعود -1

المشكله تكمن فى المؤشرات وقد قمنا بحلها والحمد لله لا اعلم ان

هذا الاجوريزم اكفأ من نظام البحث الثنائى الذى يعمل بكفاءه log2n

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

تحيـــاتى

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#20

لاحظ عدد الجمل الشرطية التي تتم في الخوارزمية

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

على الأغل نحن نتكلم عن log3n

الظاهر أنه تعقيد أقل من التعقيد log2n

لكن النقطة هنا أن دالة log دالة مميزة ومعنى أن يكون هناك عدد مضروب في log أن هذا العدد أصله أس لما داخل الـ log

على كل الأحوال سأقوم بتحويل موضوعك إلى قسم الرياضيات ليقوموا بتقييمه بشكل أفضل

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#21

فعلا اخى من الواضح ان الثنائى افضل لأنه lg n +1

ولكن كلاهما فى النهايه لوغاريتمى .. وانا اعمل علي

تعقيده حاليا ,, وسوف اضيفه حالما انتهى منه ان شاء الله

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#22
علاء الصالحي كتب:

لاحظ عدد الجمل الشرطية التي تتم في الخوارزمية

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

على الأغل نحن نتكلم عن log3n

الظاهر أنه تعقيد أقل من التعقيد log2n

لكن النقطة هنا أن دالة log دالة مميزة ومعنى أن يكون هناك عدد مضروب في log أن هذا العدد أصله أس لما داخل الـ log

على كل الأحوال سأقوم بتحويل موضوعك إلى قسم الرياضيات ليقوموا بتقييمه بشكل أفضل

تحياتي

+1

تمام الخوارزمية بتقارن مرتين علشان تعرف الرقم ف اي ثلث

لكن ف حالة البحث الثنائي تحدث المقارنة مرة واحدة

واعتذر عن عدم الاجابة ف مسألة الحد نوني بسبب الامتحانات - بالاضافة ان انا مش فاكر الفكرة :)- اوعدك بعد الامتحانات او ف ليلة امتحان ال algorithms .

تحياتي

--

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

#23

ماشى يا عم مينا بس يا ريت قبل يوم الاحد لو تقدر ...

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

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

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

مشكووور ..

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…