2012-05-31 10 views
5

मेरे पास ग्राहकों के बीच साझा की गई गतिविधियों की एक कतार है, उपयोगकर्ता गतिविधि को कैप्चर करना और दूसरी साइट पर रोबोट द्वारा निष्पादित किया गया है। सक्रियण का एक उदाहरण इस प्रकार हो सकता है:कतार में कमी एल्गोरिदम?

CREATE FOLDER /docs 
CREATE FILE /docs/journal.txt 
DELETE FILE /docs/blog.txt 
MOVE FOLDER /docs/images /docs/photos 
... 

अक्सर सक्रियण होते हैं जिन्हें एक या एक से कम किया जा सकता है। उदाहरण के लिए: कुछ की तरह

CREATE FOLDER /documents 

और::

CREATE FOLDER /docs 
RENAME FOLDER /documents 
DELETE FOLDER /documents 

कतार से पूरी तरह निकाला जा सकता है

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

बस को बदला जा सकता है।

इस तरह की कमी/अनुकूलन एक बहुत ही सामान्य समस्या की तरह लगता है, और इसे हमला करने से पहले मैं कुछ सामान्य समाधान का प्रयास करना चाहता हूं। यह एक पथदर्शी अनुकूलन समस्या की तरह दिखता है।

कोई भी विचार?

उत्तर

2

मुझे किसी पुस्तकालय या ढांचे के बारे में पता नहीं है जो आपके लिए यह करेगा। दूसरी तरफ, आपको इसके पीछे तर्क निर्दिष्ट करना होगा, और जैसा कि मैंने इसे देखा है, वैसे भी यह काम का बड़ा हिस्सा होगा।

यहाँ दृष्टिकोण है मैं ले जाएगा:

  1. कार्यों की एक संस्थानिक तरह करते हैं (फ़ोल्डर का नाम बदलने फ़ोल्डर और इतने पर बनाने "पर निर्भर करता है" ...)

  2. प्रत्येक आदेश का कोई साथ निर्भरता एक निर्भरता पेड़ में एक "रूट" का प्रतिनिधित्व करता है।

  3. प्रत्येक पेड़ से बार-बार शुरू होने वाले पेड़ को संकुचित करें।

+0

मैं वास्तव में एक पुस्तकालय की तलाश में नहीं हूं, लेकिन अगर कोई था तो मैं खुश रहूंगा। क्या आप स्पष्ट कर सकते हैं कि "पेड़ों को पतन" से आपका क्या मतलब है? –

1

एक विकल्प (कुछ हद तक एक दिग्गज यद्यपि) कतार रिकॉर्ड पर चलने और संचालन कि एक पेड़ प्रतिनिधित्व कि आप प्रोग्राम को बनाने पर फाइल सिस्टम पर प्रदर्शन कर रहे हैं अनुकरण करने के लिए किया जाएगा। संदर्भित प्रत्येक निर्देशिका के लिए आप ट्रैक कर सकते हैं, उस पर कौन से शुद्ध संचालन समाप्त हो रहे हैं। एक बार पूरा हो जाने के बाद, आप संशोधित वृक्ष संरचना पर चल सकते हैं और प्रत्येक निर्देशिका और उपनिर्देशिका पर लागू शुद्ध परिवर्तन का प्रतिनिधित्व करने वाले आदेशों की एक श्रृंखला आउटपुट कर सकते हैं।

आशा है कि इससे मदद मिलती है!

0
  1. अपने परिचालन (, बनाने के नाम बदलने, स्थान बदलना)
  2. एक कमान वर्ग कि ऑपरेशन के लिए अपने ऑपरेशन + पैरामीटर शामिल हों परिभाषित के सभी को परिभाषित करें।
  3. कुछ ऐसा लागू करें जो आपको बताएगा कि क्या दो आदेशों को जोड़ा जा सकता है और साथ ही साथ संयोजन का परिणाम क्या हो सकता है।

मुझे यह मानना ​​है कि आप केवल उन आदेशों को जोड़ सकते हैं जो तुरंत एक-दूसरे का अनुसरण कर रहे हैं या अन्यथा आप संभावित रूप से अवांछित साइड इफेक्ट्स पेश कर सकते हैं। तो जब आप yoru queue से कमांड निष्पादित करने के लिए जाते हैं, तब तक एक कमांड को पिकिंग/पॉपिंग/बनाना शुरू करें जब तक कि आप उस कमांड का सामना न करें जिसे इसमें शामिल नहीं किया जा सके।

+0

अच्छे इरादों के लिए धन्यवाद, लेकिन मुझे लगता है कि आप समस्या को समझ नहीं सकते हैं। सबसे पहले, कार्यान्वयन विवरण प्रासंगिक नहीं हैं, मैं बस एक एल्गोरिदम की तलाश में हूं। दूसरा, आदेश आवश्यक रूप से आसन्न नहीं हो सकते हैं, तो आप जो प्रस्ताव देते हैं वह काम नहीं करेगा, या एन * एन खोज की मांग करेगा। अगर मैं इसे बर्दाश्त करने के इच्छुक हूं तो बेहतर स्पष्ट समाधान हैं। –

+0

यदि आप उन पर एक सेशन के परिणामस्वरूप एन तत्वों से मिलान करने के लिए ओ (एन) या ओ (1) तरीका ढूंढते हैं तो मुझे आश्चर्य होगा (जहां op = areCyCombinable?) आपकी प्रतिक्रिया के पहले भाग के रूप में, आप कर सकते हैं मेरे कार्यान्वयन विवरण से बाहर एल्गोरिदम ले लो। मैंने आपकी सहायता करने के प्रयास के रूप में कोड स्नैपशॉट प्रदान किया। शुभकामनाएं और उम्मीद है कि आपको यह जादू समाधान मिल जाएगा, मैं इसे भी देखना पसंद करूंगा। – csauve

+1

कृपया यह भी बताएं कि आप कैसे सोचते हैं कि आप बिना किसी अवांछित दुष्प्रभावों को पेश किए बिना अपनी कतार में वस्तुओं को पुन: व्यवस्थित कर सकते हैं। उदाहरण: 1 = CreateFile (ए, "अरे आप!"), 2 = SendEmail ([email protected], सामग्रीएं (ए)), 3 = DeleteFile (ए)। यदि आप वास्तव में संयुक्त होने के लिए # 1 और # 3 चाहते हैं (परिभाषा के अनुसार वे हो सकते हैं), तो आप # 2 तोड़ देंगे। – csauve

संबंधित मुद्दे