سؤال

وأنا أبحث عن بنية بيانات المستمر فهرستها كفاءة. أنا عادة العمل في. NET، وأنا على بينة من خريطة FSharp ولكن أن تنفيذ ومعظم البلدان الأخرى وأنا على علم لا توفر سوى 'مؤشر' واحد، وعلى الجانب الأيسر من التعيين.

والأساس هنا هو السيناريو

public class MyObject
    public int Id { get; }
    public int GroupId { get; }
    public string Name { get; }

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

وأستطيع أن أفعل ذلك، ولها في الماضي، وذلك باستخدام قواميس القواميس، والتي قد أوصى في وظائف أخرى هنا على ستاكوفيرفلوو ... ومع ذلك، وأريد أيضا بنية البيانات لتكون 1) المستمرة بالكامل وكل شيء وهذا يعني 2) كفاءة في الذاكرة - وهذا يعني أن الإصدارات تحتاج إلى مشاركة العديد من العقد ممكن 3) كفاءة في modifcations - أود أن يكون سريع

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

والشكر

هل كانت مفيدة؟

المحلول

وأنا لست متأكدا من السبب في أماكن أخرى، وردود القائمة على سؤالك، والناس يوصي راكب الهياكل القائمة. Imbricating الهياكل (خرائط الخرائط والخرائط من القوائم، قواميس القواميس، ...) يعمل فقط لمؤشرين إذا واحد هو اكثر مرونة من غيرها (قيمتين لها نفس المؤشر للIndex1 تعني هذه القيم لهما نفس الرقم القياسي لIndex2 )، وهو عقبة لا لزوم له.

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

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

نصائح أخرى

وكما يمكن استخدام قاموس من قواميس، وأتوقع أن مثل وF # خريطة خرائط قد تكون ما تريد، ومنها مثلا.

Map<int, Map<string, MyObject> >  // int is groupid, string is name

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

وقد تحقق أيضا من مكتبة كلوجر؛ و أنا لا أعرف الكثير عن كلوجر، ولكن مجموعة من هياكل البيانات المستمرة كفاءة يبدو أن واحدة من نقاط القوة كلوجر ل.

ويبدو أن تحاول تطبيق مبادئ OOP لتطبيق FP الخاص بك.

إذا كنت تعتقد من حيث وظائفها، ما هو انك تحاول أن تفعل؟

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top