2009-04-21 13 views
6

एक समय को देखते हुए (जैसे। वर्तमान में 04:24 मंगलवार को बजे) के आधार पर खुला है या नहीं है, मैं सभी व्यवसायों है कि वर्तमान में का एक सेट से बाहर खुले हैं का चयन करने में सक्षम होना चाहते हैं व्यवसायों।कुशलतापूर्वक करने के लिए कि एक व्यापार स्टोर घंटे

  • मैं सप्ताह के प्रत्येक दिन के लिए हर व्यवसाय के लिए खुले और बंद बार
  • के एक व्यापार खोल सकते हैं/बंद पर ही 00, 15, 30, 45 मिनट प्रत्येक घंटे के निशान मान लेते हैं
  • मैं हर हफ्ते एक ही कार्यक्रम निर्धारित कर रहा हूं।
  • मुझे डेटा की अंतरिक्ष आवश्यकताओं की आवश्यकता नहीं है, जो कि निश्चित समय पर खुले व्यवसायों के एक समूह को तुरंत देखने में सक्षम होने में सबसे अधिक रुचि रखते हैं।
  • आपको याद है, कुछ मेरा एक दिन 11 बजे खुला रहता है और अगले दिन 1 बजे बंद रहता है।
  • छुट्टियाँ कोई फर्क नहीं है - मैं इन अलग

संभाल लेंगे जैसे कि एक समय/दिन के सप्ताह टपल साथ मैं यह कर सकते हैं कि इन खोलने/बंद करने के समय स्टोर करने के लिए सबसे कारगर तरीका क्या है तेजी पता लगाएं कि कौन से व्यवसाय खुले हैं?

मैं पाइथन, एसओएलआर और माइस्क्ल का उपयोग कर रहा हूं। मैं एसओएलआर में पूछताछ करने में सक्षम होना चाहता हूं। लेकिन स्पष्ट रूप से, मैं किसी भी सुझाव और विकल्पों के लिए खुला हूँ।

+0

क्या आप व्यवसायों को देखने की गति में या कम भंडारण स्थान लेने में दक्षता में अधिक रुचि रखते हैं? –

+0

आपको अपनी आवश्यकताओं को और अधिक स्पष्ट रूप से बताना होगा। आपको किस तरह की ग्रैन्युलरिटी की आवश्यकता है? (क्या कोई व्यवसाय 7:36 पर खुल सकता है?) साप्ताहिक पर्याप्त है या क्या विशेष मामले हैं (हर दूसरे शुक्रवार को बंद) – jfclavette

+0

छुट्टियों (बैंक छुट्टियों, राष्ट्रीय छुट्टियों) के बारे में भी क्या? या व्यापार की तरह अजीब सामान छुट्टी लेता है? – user53794

उत्तर

8

तुम सिर्फ एक समय में एक सप्ताह को देखने के लिए तैयार हैं, तो आप कर सकते हैं canonicalize सब खोलने/समापन बार सप्ताह की शुरुआत के बाद मिनट की संख्या सेट करने के लिए, रविवार 0 बजे का कहना है। प्रत्येक स्टोर के लिए, आप फॉर्म [स्टार्टटाइम, एंडटाइम, storeId] के कई tuples बनाते हैं।(रविवार के मध्यरात्रि में फैले घंटों के लिए, आपको दो टुपल्स बनाना होगा, जो सप्ताह के अंत में जा रहा है, जो सप्ताह की शुरुआत में शुरू होता है)। ट्यूपल्स का यह सेट अनुक्रमित किया जाएगा (कहें, एक पेड़ के साथ जिसे आप प्री-प्रोसेस करेंगे) दोनों स्टार्टटाइम और एंडटाइम पर। टुपल्स इतना बड़ा नहीं होना चाहिए: सप्ताह में केवल ~ 10k मिनट होते हैं, जो 2 बाइट्स में फिट हो सकते हैं। यह संरचना उपयुक्त इंडेक्स के साथ एक MySQL तालिका के अंदर सुन्दर होगी, और सूचनाओं के रूप में रिकॉर्ड के हटाए गए & रिकॉर्ड के निरंतर प्रविष्टियों के लिए बहुत लचीला होगा। आपकी क्वेरी बस "स्टोर स्टोर करें जहां स्टार्टटाइम < = समय और अंतराल> = समय" होगा, जहां रविवार को मध्यरात्रि के बाद से कैनोलिकलाइज्ड मिनट था।

जानकारी जल्दी-जल्दी बदलती नहीं करता है, और आप लुकअप बहुत तेज हो करना चाहते हैं, आप आगे हर संभव क्वेरी को सुलझाने और परिणामों को कैश कर सकते हैं। उदाहरण के लिए, एक सप्ताह में केवल 672 तिमाही घंटे की अवधि होती है। व्यवसायों की एक सूची के साथ, जिनमें से प्रत्येक को & ब्रैंडन रोड्स के समाधान जैसे समापन समय खोलने की एक सूची थी, आप बस एक सप्ताह में हर 15-मिनट की अवधि के माध्यम से फिर से शुरू कर सकते हैं, यह पता लगा सकते हैं कि कौन खुलता है, फिर उत्तर को एक लुकअप टेबल में संग्रहीत करें या मेमोरी सूची में।

+0

यह एक अच्छा समाधान है। मैं शायद एसओएलआर को पूछताछ छोड़ दूंगा, लेकिन यह मेरी लुकअप टेबल हो सकती है, जैसा कि यह था। धन्यवाद! – sotangochips

+0

स्पष्ट रूप से यह प्रश्न लेखक के लिए कोई समस्या नहीं है, लेकिन मेरे अनुभव में शुरुआती घंटों की समस्या का वास्तव में कठिन हिस्सा एक-एक अपवादों में है, जैसे कि छुट्टियां और एक बार-केवल अतिरिक्त खुलेपन (केवल एक स्टोर)। –

3

क्षमा करें मेरे पास कोई आसान जवाब नहीं है, लेकिन मैं आपको बता सकता हूं कि 90 के उत्तरार्ध में एक कंपनी में एक विकास टीम के प्रबंधक के रूप में हमें इस समस्या को हल करने के लिए काम सौंपा गया था और यह मुश्किल था।

यह साप्ताहिक घंटे नहीं है जो कठिन है, जो अपेक्षाकृत छोटे बिटकमास्क (सप्ताह के 168 बिट्स = 1 प्रति घंटे) के साथ किया जा सकता है, यह चाल उन मकानों को बंद कर देती है जो हर मंगलवार को बंद होती हैं।

बिटमैस्क से शुरू करने के बाद एक अपवाद फ़ील्ड पर जाना सबसे अच्छा समाधान है जिसे मैंने कभी देखा है।

+0

इसके लिए वास्तविक एसक्यूएल कैसा दिखता है? – sotangochips

+0

इसके अलावा, एसक्यूएल बिटवाई ऑपरेटरों केवल 64 बिट्स (अधिकतम) – sotangochips

+0

के लिए काम करते हैं यह मेरी धारणा है कि यदि आप ऐसा कुछ करने जा रहे हैं तो आप अपना इंडेक्सर और तुलनित्र लिखेंगे। – caskey

5

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

मैं बजाय एक सूची के अंदर datetimes के रूप में मूल्यों के भंडारण की कोशिश करेंगे:

openclosings = [ open1, close1, open2, close2, ... ] 

फिर, मैं अजगर की 'bisect_right() "में अपनी निर्मित" द्विभाजित "समारोह का प्रयोग करेंगे मॉड्यूल तेजी से खोजने के लिए, ओ (लॉग एन) समय, जहां उस सूची में आपका प्रश्न समय "फिट बैठता है"। फिर, लौटाई गई इंडेक्स को देखें। यदि यह सम संख्या (0, 2, 4 ...) है तो समय "बंद" बार और अगले "खुला" समय में से एक के बीच स्थित है, इसलिए दुकान तो बंद कर दिया है। तो इसके बजाय, द्विभाजन सूचकांक एक विषम संख्या है (1, 3, 5 ...) फिर समय एक खुलने और बंद करने के समय के बीच उतरा है, और दुकान खुली है।

के रूप में जल्दी नहीं बिटमैप के रूप में है, लेकिन आप संकल्प बारे में चिंता करने की जरूरत नहीं है, और मैं एक और हे (लॉग एन) समाधान है कि के रूप में सुंदर है के बारे में सोच नहीं कर सकते।

+0

हां। निश्चित रूप से विचार करने के लिए ऐतिहासिक डेटा का मुद्दा है, लेकिन यह एक और मामला है। – Mark

+0

मुझे इस समाधान को बहुत पसंद है, बहुत ही सुरुचिपूर्ण। मेरी एकमात्र टिप्पणी यह ​​होगी कि आप bisect_right() के लिए उपनाम के रूप में बस bisect() का उपयोग कर सकते हैं। – Kiv

+0

यह एक अच्छा समाधान है, लेकिन मैंने अपने प्रश्न में गलती की। मैं डेटा सेट से पूछताछ करने और खुले सभी व्यवसायों को वापस पाने की उम्मीद कर रहा हूं। मैंने गलती से इसे एक ही व्यवसाय को खुले या नहीं होने के परीक्षण के रूप में phrased किया। – sotangochips

4

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

उदाहरण के लिए, सोमवार को एक दुकान 4-5 बजे से खुला है, [40:00, 40:15, 40:30, 40:45] के लिए जोड़ा अनुक्रमित मूल्यों होगा। सोमवार को 4:24 बजे एक प्रश्न सामान्यीकृत किया जाएगा 40:15, और इसलिए उस स्टोर दस्तावेज़ से मेल खाता है।

यह पहली नज़र में अक्षम लग सकता है, लेकिन यह अनुक्रमण की गति और अंतरिक्ष के लिए एक अपेक्षाकृत छोटे निरंतर दंड है। और जितनी जल्दी हो सके खोजों को बनाता है।

0

यदि आप अपने डेटा को अच्छी तरह से नियंत्रित कर सकते हैं, तो मुझे @ सेबेस्टियन के समान सरल समाधान दिखाई देता है। फॉर्म [समय = स्टार्टटाइम, storeId] और [time = endTime, storeId] को छोड़कर, tuples बनाने की सलाह का पालन करें, फिर इन्हें सूची में सॉर्ट करें। दुकान

select storeId 
from table 
where time <= '@1' 
group by storeId 
having count(storeId) % 2 == 1 

इस अनुकूलन के लिए, आप समय टी में से प्रत्येक में एक लुकअप तालिका का निर्माण कर सकता है, स्टोर, जो टी से खुली हुई हैं की दुकान, और: यह जानने के लिए एक दुकान खुली हुई है, बस एक प्रश्न की तरह करते हैं टी और टी + 1 के बीच उद्घाटन/समापन (टी के किसी भी समूह के लिए)।

हालांकि, इस बनाए रखने के लिए कठिन होने की सबसे बड़ी खामी है (उद्घाटन ओवरलैपिंग/बंद होने का एक लंबे समय तक खुले करीब अवधि में मर्ज करने की जरूरत है)।

0

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

+0

यह एक दिलचस्प समाधान है - मैंने अंतराल को पहले एक अलग # बनाने का विचार नहीं किया था, लेकिन आप सही हैं - अगर आप मानते हैं कि अधिकतर व्यवसाय 30 अंक (या 15 पर बंद होते हैं तो यह पूरी तरह से प्रीकंप्यूटेड हो सकता है) आप फैनसीयर प्राप्त करना चाहते हैं) – sotangochips

+0

मुझे आपकी समस्या के बारे में पता नहीं है, लेकिन आपको यह भी मिल सकता है कि संयोजनों का केवल कुछ मुट्ठी भर है। मैंने थोड़ी देर पहले कुछ देखा - 80% एम-एफ, 9-5 थे। कुछ शनि पर खोले और घंटे 2, 4 या 5 तक 10 थे। रविवार को भी कम समय के साथ। कुछ देर रात की रातें। कुल मिलाकर केवल एक दर्जन उद्घाटन घंटे संयोजन –

1

अपने Solr सूचकांक में, बजाय एक सप्ताह के दौरान हर व्यवसाय के लिए हर "खुदरा सत्र" घंटे के साथ एक दस्तावेज़, सूचकांक के रूप में प्रत्येक व्यापार को सूचीबद्ध करने में।

उदाहरण के लिए यदि जो कॉफी कॉफी सोमवार सुबह 6 बजे से 9 बजे खुला रहता है और रविवार को बंद हो जाता है, तो आप छह अलग-अलग दस्तावेजों को सूचीबद्ध करेंगे, प्रत्येक में दो अनुक्रमित फ़ील्ड, "खुले" और "बंद" होंगे। यदि आपकी इकाइयां 15 मिनट अंतराल हैं, तो मान 0 से 7 * 24 * 4 तक हो सकते हैं। मान लें कि आपके पास प्रत्येक व्यवसाय के लिए एक अद्वितीय आईडी है, इसे प्रत्येक दस्तावेज़ में संग्रहीत करें ताकि आप सत्रों को व्यवसायों में मैप कर सकें।

तो फिर तुम Solr में एक सीमा खोज बस कर सकते हैं:

खुला: [* एन करने के लिए] और करीब: [एन 1 के लिए *]

जहां N वां 15 मिनट का अंतराल के लिए की जाती है कि वर्तमान समय में आता है। उदाहरण के लिए अगर यह बुधवार को 10:10 ऐम के, आपकी क्वेरी होगा:

खुला: [112 * करने के लिए] और करीब: [* 113 के लिए]

"उर्फ एक सत्र है कि कम से या 10 से पहले शुरू होता है लगता है: 00:00 बुधवार को 10:15 बजे बुधवार को समाप्त होता है और बुध "

यदि आप अपनी खोज में अन्य मानदंडों जैसे स्थान या उत्पादों को शामिल करना चाहते हैं, तो आपको प्रत्येक सत्र दस्तावेज़ के साथ इसे अनुक्रमणित करने की आवश्यकता होगी। यह थोड़ा अनावश्यक है, लेकिन यदि आपकी अनुक्रमणिका बड़ी नहीं है, तो यह कोई समस्या नहीं होनी चाहिए।

+0

मानते थे कि मैंने सेबेस्टियन के जवाब को बहुत करीब से नहीं पढ़ा था। मेरा जवाब मूल रूप से उसी अवधारणा के रूप में है लेकिन सोलर में लागू किया गया है। – KenE

+0

कोई चिंता नहीं! मुझे लगता है कि यह बहुत अच्छा है। मैं इस तरह से ऐसा करने का विचार नहीं किया होता। मुझे लगता है कि मुझे "व्यंजन" आदि जैसे अन्य क्वेरी पैरामीटर निर्दिष्ट करने की आवश्यकता हो सकती है, इसलिए मुझे प्रत्येक व्यवसाय के साथ समय अंतराल सूचकांक करना पड़ सकता है। – sotangochips

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