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

اختصار الوقت للبحث في Arraylist مرتب ترتيب ابجدي

مغلق
بدأه alfarees في 9 يناير 2008 · 8 رد · 2,193 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اخواني الاعزاء

انا عندي ArrayList من نوع string

و هو عباره عن قاموس انجليزي يحتوي على 25 الف كلمه مرتبه ترتيب ابجدي

و انا هدفي هو البحث عن وجود كلمه معينه في هذا ArrayList

انا طبعا استخدمت الميثد

ArrayList.contains(theKye)

بس هذا راح يطول جدا و ياخذ وقت لانه مثل ما ذكرت القائمه تحوي 25 الف كلمه

فهل هناك اي اقتراح او طريقه بحيث اني اختصر عمليه البحث و اخليها محصوره في الكلمات اللي تبدا بنفس الحرف مثلا او شي من هالقبيلل؟؟؟

على فكره .. فكره عمل البرنامج هي عباره عن مدقق املائي

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

فلو كانت كلمه وحده بس .. ممكن يقوم ب 25 الف عمليه

فما بالكم بنص كاااامل

اتمنى ان الصوره تكون وضحت

و في انتظار ارائكم..

لكم مني اجمل تحيييه..

#2

يمكنك تطبيق فكرة ال hashing

وذلك بعمل HashTable عدد عناصرها هو عدد الحروف الأبجدية أي تتكون من 28 عنصر (حسب ما أذكر هذا هو عدد الحروف)

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

ربما بالمثال توضح الأمور قليلا، إليك هذا الكود فقط للتوضيح وليس للعمل:

HashTable table = new HashTable();
table.put("A", new Map());
.
.
.
table.put("Z", new Map());

private void insertElement(){
   table.get("O").put("Omar","عمر");
}

private String searchElement(String word){
   return table.get(word[0]).get(word).toString;
}

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

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

#3

يعطيك العافية اخوي على المساعده

بس للاسف .. فانا مش ذاك الزود في البرمجه

فبصراحة تنحت قدام الكود

انا بحاول اني اعلق على الاشياء اللي فهمتها و ياريت تساعدني في فهمها اكثر

اول شي الموضوع انو انا عندي هذه المصفوفة:

ArrayList<String> dicArray = new ArrayList<String>();
\\ طبعا انا اضفت لهذه المصفوفة عناصر ، هذه العناصر عباره عن 25 الف كلمه بالانجليزي مرتتبه ترتيب ابجدي
\\ يعني الحين لو تمتب الامر هذا
System.out.println(dicArray);
//حيتم طباعه 25 الف كلمه اللي هي موجود اصلا في المصفوفة

اتمنى ان فكرتي تكون وضحت

الحين بالنسبة للطريقه اللي نصحتني بيها

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

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

فياريت توضحلي كيف ممكن انقل المصفوفة لهذا الجدول و من ثم هل ممكن اني انقل هذا الجدول للمصفوفة مرة ثانيه..

و ثاني شي بالنسبة للكود .. فهذه تعليقاتي عليه:

HashTable table = new HashTable();\\ هذه جميله و فهمناها
table.put("A", new Map());\\ هنا ننشيء الاعمده للجدول بنائا على عدد الاحرف اللي هي 26 ، بس new Map ايش المقصود فيها؟؟
.
.
.
table.put("Z", new Map());

private void insertElement(){ \\ هنا انا راح انقل العناصر من المصفوفة للجدول ، مع انو حيكون صعب جدا اني احط 26 شرط علشان اقدر اقسم الكلمات حسب الحرف الاستهلالي .. بس نفترض اننا سويناها
   table.get("O").put("Omar","عمر");
}

private String searchElement(String word){
   return table.get(word[0]).get(word).toString;\\ هنا مالمقصود بـ word[0]).
}

انا عارف اني راح اعذبك معايا .. بس اتمنى انك تساعدني

بس عندي ملاحظة بسيطه ... هل تتوقع ان هالطريقه راح تفيد من ناحيه الوقت و لالا

لاني بصراحة احس انو البروسسر راح ينفجر (:

مع احترامي و تقديري

#4

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

الآن لنفترض أن عندك كتاب مكون من 26 ألف فصل وأنت تريد البحث عن فصل بعنوان "هجرة الرسول" ماذا ستفعل، ستمسك فهرس الفصول وستبحث في عدد 26 ألف فصل عن "هجرة الرسول"

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

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

يتبع

تم تعديل هذه المشاركة بواسطة prog_omer في 10 يناير 2008 في 13:21

#5

الآن لنفترض أنك قسمت الكتاب إلى أجزاء كل جزء في كتاب مستقل، بحيث الجزء الأول يحوي فقط على الفصول التي تبدأ بالحرف الأول، والجزء الثاني يحتوي فقط على الفصول التي تبدأ بالحرف الثاني، وهكذا

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

وهذا ما حاولت عمله في المثال الذي شرحته،

فأنا أريد عمل 26 مصفوفة كل مصفوفة تحوي على الكلمات التي تبدأ بحرف معين، ووضعت كل هذه المصفوفات في HashTable

HashTable table = new HashTable();
table.put("A", new ِArrayList());
.
.
.
table.put("Z", new ArrayList());

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

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

ArrayList list = new ArrayList();

while (there are words in the file){
  get the current_word;
  list.put(current_word); 
}

الآن هذا السطر :

  list.put(current_word);

يضع الكلمات بشكل عشوائي في المصفوفة، نحن نريد وضعها في ال table الذي أنشأناه وفي مكانه الصحيح هناك. وهذا يتطلب أولا معرفة الحرف الأول للكلمة

current_word[0]

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

ArrayList list = table.get(current_word[0]);

ووضع الكلمة فيها عن طريق الكود التالي

list.put(current_word);

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

على العموم إذا فيه أي أسئلة أنا تحت أمرك

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

تم تعديل هذه المشاركة بواسطة prog_omer في 10 يناير 2008 في 13:52

#6

يعطيك الف عافية

بحاول اني اجرب الشرح و ان شاء الله يضبط

بس بالنسبة لطريقه البحث الثنائي .. اتمنى انك تعطيني نبذه عنها اذا مافيه مانع

لانو مصفوفتي بالفعل مرتبه ترتيب ابجدي

لانها ماخذوه من قاموس انجليزي

يعني فيها 26 الف كلمه تبدا من A TO z

هذا لو ما فيها كلفه عليك

و جزاك الله كل خيير

مع احترامي،،

#7

Binary Search

لنفترض أني قلت لك سأختا رقم في عقلي من 1 إلى 100 وعليك أن تخمن هذا الرقم، فما هي أفضل طريقة منطقية للوصول لهذا الرقم بأقل عدد ممكن من المحاولات وبحيث لا تعتمد على الحظ.

سأقول لك هل الرقم هو 50 ستقول لي لا الرقم أكبر من خمسة

عرفت من إجابتك أن الرقم أصبح محصورا بين 50 و 100

سأقول لك الرقم هو 75

ستقول لي لا أكبر من 75

عرفت الآن أن العدد المطلوب هو بين 75 و 100

سأقول لك الرقم المطلوب هو 87

ستقول لي لا أكبر

عرفت الآن أن الرقم المطلوب هو بين 87 و 100

سأقول لك أن الرقم هو 93

ستقول لي لا أكبر

عرفلت الآن أن الرقم بين 93 و 100

سأقول لك الرقم هو 96

ستقول لي لا أكبر

عرفت الآن أن الرقم بين 96 و 100

سأقول لك 98

ستقول لي لا أكبر

عرفت الآن أن الرقم هو 99

أي أننا عرفنا في سبعة محاولات فقط أن نبحث عن رقم بين مائة رقم

هذه هي فكرة البحث الثنائي

#8

الآن لو طبقنا هذا الفهم على مثال الكلمات

تريد البحث عن كلمة Orange

ستفترض دائما أن الكلمة المراد البحث عنها هي في نتصف المصفوفة، وبالتالي سوف تحضر العنصر رقم 13 ألف في المصفوفة، لو كان هو Orange فبها ونعمت،

طيب لم يكن هو هنا احتمالان أن يكون أكبر منها أبجديا أو أصغر منها

دعنا نفترض أنه أكبر منها أبجديا، فكان العنصر رقم 13 ألف مثلا هو كلمة Pen

الآن عرفنا بما أن المصفوفة مرتبة أن كلمة Orange التي نبحث عنها موجودة في النصف الأول من المصفوفة، أي أنها بين العنصر رقم 1 والعنصر رقم 13 ألف

سنفترض الآن أن العنصر رقم 6500 هو كلمة Orange لو كان هو فيها ونعمت

ولكن لنفترض أن هذا العنصر كان كلمة Ngkhjo ومتسألنيش يعني إيه الكلمة ديه

الآن عرفنا كلمة Orange بين العنصر رقم 6500 والعنصر رقم 13 ألف

وهكذا حتى تصل

هذا مثال بالكود لهذه الطريقة في البحث

BinarySearch(A[0..N-1], value, low, high) {
	   if (high < low)
		   return -1 // not found
	   mid = (low + high) / 2
	   if (A[mid] > value)
		   return BinarySearch(A, value, low, mid-1)
	   else if (A[mid] < value)
		   return BinarySearch(A, value, mid+1, high)
	   else
		   return mid // found
   }
#9

اهااااا

هذه عندي خبر بيها

بس اختلط على المسمى العربي و الانجليزي

يجزاك الله الف خييير

و الله يكثر من امثالك

و يسسد بالخير خطاااك

.. انا كذا راح اجرب الطرق كلها و اشوف الانسب لي

و انتا كفيت ووفيييت

مع احترامي و تقديري،،،

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

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