سؤال

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

الفرق بين هذه المجموعات "العادية" هي أن العضوية مؤقت - عندما ينضم المستخدم إلى المجموعة، يقرر طول العضوية: 5 أيام، الأسبوع، 2 أسابيع، إلخ (الخيارات محددة مسبقا). أو يحتمل أن كل شيء يمكن تعيين العضوية لتكون ذات الطول نفسه - يقول أسبوعا - إذا هذا يجعل الشيء أبسط.

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

طريقة "واضحة" لحساب عدد الأعضاء يبدو تشغيل وظيفة Cron، كما يقول يوميا، وتذهب من خلال كل عضو في كل مجموعة واحدة تلو الأخرى. إذا انتهت صلاحية العضوية، فقم بإزالة هذا العضو من المجموعة وانخفاض عدد عضوية المجموعة بنسبة 1.

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

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

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

المحلول

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

عندما ينضم الشخص إلى مجموعة، أضف 1 إلى المجموع المجموع، وأضف 1 إلى يطرحهم من أجل هذه المجموعة في اليوم الذي ستنتهي عضويته.

إذا تغير تاريخ انتهاء الصلاحية للشخص، قم بإزالة 1 من الأشخاص إلى طرح تاريخ انتهاء الصلاحية القديم (لهذه المجموعة)، وإضافة 1 إلى تاريخ انتهاء الصلاحية الجديد.

أخيرا، بالطبع، مرة واحدة في اليوم طرح المبلغ الصحيح من كل مجموعة لهذا اليوم.

نصائح أخرى

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

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

قد يعمل هذا أيضا للحصول على عضوية طول المتغير، ولكن عليك الحفاظ على قائمة فرزها.

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

حجم التخزين الخاص بك يتناسب مع طول أطول عضويتك.

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