مقدمة
في الليلة الماضية ، أردت إضافة int إلى جدول القاموس في تطبيق Android. إشعار Eclipse محدد اليوم.
استخدم sparsearray الجديد <string> (...) بدلاً من ذلك للحصول على أداء أفضل
هذا التحذير يعني استبداله باستخدام sparsearray للحصول على أداء أفضل.
رمز المصدر
نظرًا لأن الكود الكلي لـ SparSearray بسيط نسبيًا ، فإن إظهار الكود المصدري أولاً ، ثم تحليل سبب استخدام SparSearray أداء أفضل من استخدام HashMap.
الطبقة العامة SPARSERRAY <e> complicable {private static comple * * ينشئ sparsearray جديد لا يتطلب أي تعيينات حتى * y allcation لإيقاف * عدد التعيينات. arlocations = كائن جديد [initialCapacity] ؛} msize = 0 ؛}} overridesuppressWarnings ("غير محدد") sparsearray public <e> clone () {sparsearray <e> clone = null ؛ ) super.clone () ؛ * يحصل على كائن MAPD من مفتاح المواصفات ، أو < / null </code> * إذا لم يكن هناك مثل هذا التعيين. يحصل على الكائن من المفتاح المحدد ، أو كائن تحديد * إذا لم يكن هناك مثل هذا ping. ، MSIZE ، مفتاح) ؛ مفتاح تحديد ، إذا كان هناك أي. ! = تم حذفه) {mvalues [ ؛}/ ** *يزيل القيم الفهرس ؛} / ** * إزالة التعيينات كدفعة. (MSIZE ، index+size) ؛ "sparsearray" ، "GC" ) {value = القيم [i] ؛ } o ++ ؛}} mgarbage = false ؛ هناك واحد. آخر {i = ~ i ؛ mkeys.length) {gc () ؛ MSIZE + 1) ؛ إلى " + n) ؛ system.arraycopy (mkeys ، 0 ، nkeys ، mkeys.length) ؛ system.arraycopy (mvalues ، 0 ، nvalues ، 0 ، mvalues.length) ؛ ys ؛ mvalues = nvalues ؛ -i! = 0) {// "sparsearray" ، (MValues ، MValues ، I+1 ، Mize -I) ؛ / public int size () {gc () ؛} إرجاع msize ؛} / ** ** ** * الواردة في ange <code> 0 ... size () -1 </code> ، إرجاع * المفتاح من <code> فهرس </code> رسم خرائط للمفاتيح Thing SPARSERRAY. سيعود المفتاح و <code> keyat (size () -1) < / code> مفتاح LARGES *. mkeys [index] ؛}/** * بالنظر إلى فهرس في النطاق <code> 0 ... size ()- 1 </code> ، إرجاع * القيمة من الفهرس </code> المفتاح th- تخزين القيمة أن هذا sparsearray يتخزن. يرتبط بأصغر المفتاح والقيمة (الحجم () -1) </ c. الفهرس) {if (mgarbage) {gc () ؛} return (e) es [index] ؛} / * * * مع ذلك يضع قيمة * جديدة لـ < / code> TH key-value stand that * sparsearray st. } mvalues [index] = value ؛} / ** * إرجاع الفهرس الذي سيعود إليه {link {link #keyat} المفتاح المحدد * ، أو رقم سالب إذا لم يتم تعيين مفتاح * المحدد. / public IndexOfKey (int key) {if (mgarbage) {gc () ؛} return c OntainerHelpers.BinarySearch (mkeys ، msize ، key) ؛} / *** إرجاع فهرس من أجله {link #valueat} * المفتاح المحدد ، أو رقم سالب إذا لم يكن هناك خريطة مفاتيح إلى القيمة المحددة. ابحث عن واحد منهم فقط. if (mgarbage) {gc () ؛} لـ (i <msize ؛ i ++) if (mvalues [i] == value) return i ؛ من هذا sparsearray. MSIZE = 0 ؛ if (msize! = 0 && k <= msize -1]) ) {int n = arrayalintarraysize (pos + 1) ؛ mkeys.length + "to" + n) ؛ POS] = مفتاح ؛ يحتوي على itseel كقيمة ، سوف تظهر حلقة ST "(هذه الخريطة)" * في مكانها. Buffer = New StringBuilder (MSIZE * 28) ؛ ؛} مفتاح keyat (i) آخر {buffer.append ("(" ("(" end ('}') ؛ return buffer.toString () ؛}}
أولاً ، انظر إلى مُنشئ Sparsearray:
/*** يخلق sparsearray جديد لا يحتوي على تعيينات.* /public sparsearray () {this (10) ؛} /*** يخلق sparsearray لا تتطلب* أي تعيينات إضافية للذاكرة لتخزين* رقم* التعيينات. ؛يمكن رؤية من المُنشئ أن حجم الحاوية قد تم تعيينه مسبقًا ، والحجم الافتراضي هو 10.
لنلقي نظرة على عملية إضافة البيانات:
/ ** يضيف رسم الخرائط من المفتاح المحدد إلى القيمة المحددة ، * استبدال الخرائط السابقة من المفتاح المحدد إذا كان هناك واحد. BinarySearch (mkeys ، MOD ، key) ؛ {mkeys [i] = mvalues ؛ ، MSIZE ، KEY) ؛} if (msize> mkeys.length) .e ("sparsearray" ، "تنمو" + الطول "إلى" + n) ؛ mvalues = nvalues ؛} if (msize -i! = 0) {// log.e ("sparsearray" ، "move" + (mysize -i)) ؛ 1 ، MOD -I) ؛
انظر إلى طريقة التحقق من البيانات:
/** * يتم تعيين الكائن من مفتاح تحديد ، أو <code> null </code> * إذا لم يكن هناك مثل هذا التعيين. * يتم تعيين الكائن من المفتاح المحدد ، أو كائن تحديد * إذا لم يكن هناك مثل هذا maping. ) ؛
يمكن ملاحظة أنه في عملية وضع البيانات والحصول على البيانات ، تسمى خوارزمية البحث المزدوجة بشكل موحد.
int binarysearch (int [] int ، int int) {int lo = 0 ؛ 1 ؛} آخر {return mid ؛ أنا شخصياً أعتقد أن طريقة (lo + hi) >>> 1 غريبة بعض الشيء ، ومن الأفضل استخدام lo + (hi -lo) / 2 مباشرة.