ما هو خوارزمية جيدة من أجل تحرير "الجدول الزمني" الأكثر كفاءة ؟

StackOverflow https://stackoverflow.com/questions/172302

  •  05-07-2019
  •  | 
  •  

سؤال

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

تحرير: كما اقترح لدي إلى حد كبير تقصير السؤال.

في طاولة واحدة ، وأنا أضم الموارد مع فترة من الوقت عندما يتم استخدامها.

أود أيضا أن يكون الجدول الثاني (الجدول ب) والذي يستخدم معرف من الجدول الأجنبية الرئيسية.

دخول من الجدول المقابل أن الجدول B سوف يكون فترة من الوقت الذي يستوعب فترة من الوقت من الجدول باء.ليس كل الإدخالات في الجدول سوف يكون إدخال في الجدول باء.

أنا توفير واجهة للمستخدمين تحرير الموارد الموعد المحدد في الجدول ألف -أنها توفر أساسا مجموعة جديدة من بيانات الجدول أن كنت بحاجة إلى علاج مثل مهرجان دبي السينمائي الدولي من نسخة في ديسيبل.

إذا كانت إزالة كائن من الجدول المشار إليه في الجدول B, أريد أن إزالة الإدخال من الجدول ب أيضا.

وذلك نظرا التالية 3 مجموعات:

  • الكائنات الأصلية من الجدول (من DB)
  • الكائنات الأصلية من الجدول ب (من DB)
  • تحرير مجموعة من الكائنات من الجدول (من المستخدم, لذلك لا معرفات فريدة)

أحتاج خوارزمية التي سوف:

  • ترك الصفوف في الجدول والجدول ب يمسها إذا لا يلزم إجراء تغييرات على هذه الكائنات.
  • إضافة صفوف إلى الجدول حسب الحاجة.
  • إزالة الصفوف من الجدول والجدول ب حسب الحاجة.
  • تعديل الصفوف في الجدول والجدول ب حسب الحاجة.

مجرد فرز الكائنات في الترتيب حيث لا يمكن تطبيق قاعدة البيانات المناسبة العمليات هي أكثر من كافية عن حل.

مرة أخرى, يرجى الإجابة على وجه التحديد أو عموما كما تريد, أنا أبحث عن المشورة ولكن إذا كان شخص ما لديه كامل الخوارزمية التي من شأنها أن مجرد جعل بلدي اليوم.:)

تحرير: ردا على lassvek انا توفير بعض التفاصيل الإضافية:

الجدول باء البنود هي دائما الواردة بالكامل داخل الجدول البنود, وليس مجرد متداخلة.

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

على سبيل المثال (استخدام الاختزال):

Table A
ID Resource    Start         End
01 Resource A  10/6 7:00AM   10/6 11:00AM
02 Resource A  10/6 1:00PM   10/6 3:00PM

Table B
ID Table_A_ID  Start         End
01 02          10/6 1:00PM   10/6 2:00PM

لذلك أريد التالية السلوكيات:

  • إذا كنت إزالة معرف 02 من الجدول ، أو تقصيره إلى 2:00 مساء - 3:00 م, يجب إزالة معرف 01 من الجدول باء.
  • إذا كنت تمديد الجدول ID 01 إلى حيث ينتهي في 1:00 م ، اثنين من هذه الإدخالات يجب أن يتم دمجها معا في صف واحد, و الجدول ب ID 01: الآن يجب أن نشير إلى table ID 01.
  • إذا كنت إزالة 8:00 صباحا-10:00 صباحا من الجدول ID 01, التي ينبغي أن تكون مقسمة إلى بابين:واحدة من 7:00 صباحا-8:00 صباحا و إدخال جديد (رقم 03) 10:00 صباحا-11:00 صباحا.
هل كانت مفيدة؟

المحلول

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

يمكنك إعطاء بعض الأمثلة الملموسة ما تريد القيام به ؟

هل يعني أن timespans المسجلة في الجدول يحتوي على تماما timespans في الجدول باء من هذا القبيل ؟

|---------------- A -------------------|
    |--- B ----|      |--- B ---|

أو التداخل مع ؟

    |---------------- A -------------------|
|--- B ----|                        |--- B ---|

أو في الطريق المعاكس ، timespans في ب يحتوي على/التداخل مع ؟

دعونا نقول إنه أول واحد ، حيث timespans في ب الداخل/نفس الزمنية المرتبطة في الجدول ألف -

هل هذا يعني أن:

* A removed A-timespan removes all the linked timespans from B
* An added A-timespan, what about this?
* A shortened A-timespan removes all the linked timespans from B that now falls outside A
* A lenghtened A-timespan, will this include all matching B-timespans now inside?

هنا مثال:

|-------------- A1 --------------|    |-------- A2 --------------|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|

ثم إطالة A1 و تقصير و نقل A2 ، بحيث:

|-------------- A1 ---------------------------------|  |--- A2 --|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|

وهذا يعني أن كنت ترغب في تعديل البيانات مثل هذا:

1. Lengthen (update) A1
2. Shorten and move (update) A2
3. Re-link (update) B3 from A2 to A1 instead

كيف حول هذا التعديل ، A1 تطول ، ولكن ليس بما يكفي لاحتواء B3 تماما, و A2 يتم نقل/تقصير بنفس الطريقة:

|-------------- A1 -----------------------------|      |--- A2 --|
  |---- B1 ----|  |----- B2 ---|       |---- B3 ----|  |-- B4 --|

منذ B3 الآن لا تقع تماما إما A1 أو A2, إزالة ذلك ؟

أنا بحاجة إلى بعض أمثلة ملموسة على ما تريد القيام به.


تحرير المزيد من الأسئلة

حسنا, ماذا عن:

|------------------ A -----------------------|
  |------- B1 -------|  |------- B2 ------|
                           |---|                   <-- I want to remove this from A

ماذا عن هذا ؟

إما:

|------------------ A1 ----|   |---- A2 -----|
  |------- B1 -------|  |B3|   |--- B2 ---|

أو:

|------------------ A1 ----|   |---- A2 -----|
  |------- B1 -------|

تلخيص كيفية التعامل مع أسئلة حتى الآن:

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

سأعمل على تنفيذها في C# التي يمكن أن تعمل عندما أعود إلى البيت من العمل ، سأعود مع المزيد في وقت لاحق الليلة.


تحرير وهنا طعنة في خوارزمية.

  1. تحسين القائمة الجديدة الأولى (أي.الجمع بين المتاخمة فترات ، إلخ.)
  2. "دمج" هذه القائمة مع سيد فترات في قاعدة البيانات بالطريقة التالية:
    1. الحفاظ على المسار من حيث في كلتا القائمتين (ie.الجديدة والقائمة) أنت
    2. إذا الحالية الفترة الجديدة كليا قبل أن القائمة الحالية الفترة ، إضافة ، ثم نقل إلى القادم الجديد الفترة
    3. إذا الحالية مرحلة جديدة تماما بعد أن القائمة الحالية الفترة ، وإزالة الفترة الحالية وجميع الطفل فترات, ثم الانتقال إلى التالي الفترة الحالية
    4. إذا اثنين من التداخل ، ضبط القائمة الحالية فترة تساوي الفترة الجديدة, بالطريقة التالية ، ثم ننتقل الى القائمة والجديدة الفترة
      1. إذا الجديدة تبدأ قبل الفترة الحالية ، ببساطة تحريك تبدأ
      2. إذا الجديدة تبدأ فترة بعد فترة ، تحقق مما إذا كان أي طفل فترات في الفرق الفترة ، وتذكر لهم ، ثم نقل تبدأ
      3. تفعل الشيء نفسه مع الطرف الآخر
  3. مع أي فترات لك "تذكرت" ، معرفة ما إذا كانت يحتاج إلى relinked أو حذفها

يجب إنشاء مجموعة كبيرة من اختبارات الوحدة و تأكد من تغطية جميع مجموعات من التعديلات.

نصائح أخرى

أقترح عليك فصل الأسئلة الخاصة بك في منفصلين منها:أول يجب أن يكون شيئا مثل:"كيف يمكنني سبب عن جدولة الموارد عندما يمثل الجدول ذرة كمورد مع وقت بدء ونهاية الوقت؟" هنا مهارة اقتراح لاستخدام الفاصل الجبر يبدو المناسب.يرجى الاطلاع ويكيبيديا 'الفاصل الزمني الرسم البياني' و في جامعة ولاية نيويورك خوارزمية مستودع الدخول على جدولة.السؤال الثاني هو قاعدة بيانات السؤال:"وبالنظر إلى خوارزمية التي مواعيد فترات وبيان ما إذا كان اثنين من فترات التداخل أو واحد يرد في آخر كيف يمكنني استخدام هذه المعلومات لإدارة قاعدة البيانات في مخطط?" وأعتقد أنه بمجرد جدولة الخوارزمية في قاعدة البيانات السؤال سيكون أسهل بكثير من حل.HTH, يوفال

لك وظيفة تقريبا في "طويلة جدا ؛ لم اقرأ" الفئة - تقصير ربما سوف تعطيك المزيد من ردود الفعل.

على أي حال, على هذا الموضوع:يمكنك محاولة تنظر إلى شيء يسمى "فاصل الجبر"

كما فهمت أنت, يمكن للمستخدمين فقط تؤثر مباشرة في الجدول ألف -على افتراض أنك البرمجة في C#, هل يمكن استخدام بسيط ADO.Net بيانات لإدارة التعديلات على الجدول ألف -على TableAdapter يعرف أن تترك يمسها الصفوف وحده للتعامل مع الجديد, تعديل و حذف الصفوف بشكل مناسب.

وبالإضافة إلى ذلك يجب أن تحدد المتتالية حذف من أجل إزالة تلقائيا الأشياء المقابلة في الجدول باء.

الحالة الوحيدة التي يتم التعامل معها بهذه الطريقة إذا الزمنية في الجدول هو تقصير s.t.فإنه لا تستوعب المقابلة سجل في الجدول باء بعد الآن.هل يمكن ببساطة التحقق من أن الحالة في تحديث الإجراء المخزن أو بدلا من ذلك تحديد تحديث الزناد على الجدول ألف -

يبدو لي مثل أي خوارزمية هذا سوف يكون على تمرير من خلال NewA ، مطابقة ResourceID, StartTime ، EndTime ، وتتبع العناصر التي من OldA الحصول على ضرب.ثم لديك مجموعتين من عدم مطابقة البيانات ، UnmatchedNewA و UnmatchedOldA.

أبسط طريقة يمكن التفكير في المضي قدما هو الأساس تبدأ من جديد مع هذه:كتابة كل من UnmatchedNewA إلى DB, نقل العناصر من ب من UnmatchedOldA في جديد مجموعة مفاتيح (ولدت للتو) حيث من الممكن حذف عندما لا.ثم يمسح بها كل من UnmatchedOldA.

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


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

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

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