साप्ताहिक डेटा श्रृंखला के बीच लेनदेन का निर्धारण करने के लिए एल्गोरिदम?


9

मैं एक छोटा रिपोर्टिंग टूल (साइक्लाइट बैकएंड के साथ) विकसित करने की कोशिश कर रहा हूं। मैं इस उपकरण को "लेन-देन" खाता बही के रूप में सबसे अच्छा वर्णन कर सकता हूं। मैं जो करने की कोशिश कर रहा हूं वह साप्ताहिक डेटा निकालने से "लेनदेन" का ट्रैक रखने के लिए है:

  • "नया" (या जोड़ें) - संसाधन मेरे ऐप के लिए नया है क्योंकि मेरे ऐप ने इस संसाधन को ट्रैक नहीं किया होगा क्योंकि इसे अर्क के रूप में नहीं देखा गया है।
  • "अपडेट" (या हिट) - उस संसाधन का एक हालिया उपयोग है, एक और सप्ताह तक अवधारण अवधि अपडेट करें।
  • "हटाएं" (या ड्रॉप) - इस आइटम ने अंतिम रिपोर्ट के बाद से कोई उपयोग नहीं देखा (वैकल्पिक, लेकिन संसाधनों की मांग में सप्ताह-दर-सप्ताह परिवर्तन रेखांकन के लिए अच्छा होगा)।

मेरे पास सभी एक साप्ताहिक डेटा निकालने (पाइप-सीमांकित फ्लैट फ़ाइल) है जो एक विरासत संग्रह / रिकॉर्ड-प्रबंधन प्रणाली से आ रहा है जिसका मेरे पास कोई नियंत्रण नहीं है।

प्रत्येक पंक्ति को मूल रूप से आसुत किया जा सकता है:
resource_id | resource info | customer_id | customer_info

नमूना डेटा:

10| Title X       | 1 | Bob
11| Another title | 1 | Bob
10| Title X       | 2 | Alice

लक्ष्य उन संसाधनों पर रिपोर्ट करना आसान बनाता है जिन्होंने एक्स-महीनों (अंतिम हिट के आधार पर) के लिए उपयोग नहीं देखा है। एक प्रतिधारण अवधि होती है, जहां संसाधन लोकप्रिय होने पर आसानी के लिए इधर-उधर रखे जाते हैं। एक संसाधन जो 18 महीनों तक उपयोग नहीं करता है, वह दीर्घकालिक अभिलेखीय कहीं और के लिए चिह्नित है।

यह एक आम समस्या होनी चाहिए। आश्चर्य होता है कि डेटा सेट्स के बीच क्या नया / समान / हटाया गया है यह निर्धारित करने के लिए एक सामान्य-उद्देश्य एल्गोरिथ्म है (db बनाम नवीनतम एक्सट्रैक्ट)?

जवाबों:


1

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

NPV = PV- (PV (CP / T) या नया वर्तमान मान वर्तमान मान के बराबर होता है जो वर्तमान अवधि (अंतिम प्रविष्टि के बाद के महीनों) को टर्म से विभाजित किया जाता है (जैसे 18 महीने) जब संसाधन मान 0 पर गिरता है तो यह शुद्ध वर्तमान मूल्य होता है खर्च किया जाता है।

यदि आप मुझे एक लंगड़ा देते हैं, तो आप चाहते हैं कि मैं यहां एक संपादन में कोड पोस्ट कर दूं


भाषा वह महत्वपूर्ण नहीं है। रूबी या सी ++ अगर मुझे चुनना था। यदि आप HTML 4.0 में एक एल्गोरिथ्म लिख सकते हैं तो सख्त आप मेरे हीरो होंगे। उस आखिरी भाग के बारे में मजाक करना :)
स्वार्टज़

कोड देखने के लिए इच्छुक होंगे। रूबी या सी ++। धन्यवाद।
स्वार्ट्ज

0

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

एक तालिका में नए परिवर्धन को खोजने के लिए एसक्यूएल का उपयोग करने का उदाहरण: /programming/2077807/sql-query-to-return-differences-between-two-tables

यदि आपके DB में कोई फ़ील्ड लेन-देन की तारीख संग्रहीत करता है, तो आप उन सभी उपयोगकर्ताओं को क्वेरी कर सकते हैं, जिनके पास पिछले 18 महीनों में लेन-देन हुआ है। फिर संग्रह सिर्फ पूर्ण डीबी है। वैकल्पिक रूप से, आप उन सभी उपयोगकर्ताओं को क्वेरी कर सकते हैं जिन्होंने अपना डेटा नहीं निकाला है, फिर उन्हें छोड़ दें। अपडेट इस सप्ताह केवल किसी भी पंक्तियों को टाइमस्टैम्प किए गए हैं।


बेहतर है, यह कम से कम एक डेटा-केंद्रित समाधान है, लेकिन यह अभी भी ओवरकिल है
जे-बॉस

मैं समय के लिए एक साइक्लाइट का उपयोग कर रहा हूं क्योंकि यह शुरू करना आसान है। आसानी से MySQL (या PostgreSQL) पर जा सकता है। अगर नो-एसक्यूएल बैकएंड का उपयोग करते हुए इस काम को और बेहतर बनाने के लिए कुछ भी किया जाता है, तो मैं सभी कान हूं।
स्वार्ट्ज

खैर, मेरी सोच मुख्य रूप से है कि आप एक डेटाबेस में पंक्तियों को परिवर्तित कर रहे था वैसे भी । यदि आपको इसे कई प्रक्रियाओं से समवर्ती रूप से चलाने की आवश्यकता नहीं है, तो मुझे नहीं लगता कि आप SQLite की तुलना में कुछ अधिक हैवीवेट पर स्विच करना चाहते हैं।
डेविसलर

समवर्ती प्रसंस्करण के लिए कोई ज़रूरत नहीं है। लेकिन मुझे संसाधनों के बारे में डेटा कहीं स्टोर करने की आवश्यकता है। SQL db एक अच्छे विकल्प की तरह लग रहा था, हालाँकि, डेल्टास को प्रोसेस करने के लिए डेटा को किसी भी डेटाटाइप में लोड करने से मुझे कोई रोक नहीं सकता है। सभी मैं प्रत्येक एक्सट्रैक्ट रन के अंत में यह जानना चाहता हूं कि नया क्या है, वही रहा, और जो गायब हो गया है। मैं यह पता लगा सकता हूं कि इस जानकारी से आवश्यक रूप से रिकॉर्ड कैसे अपडेट किया जाए।
स्वार्ट्ज

आपके द्वारा डेटा को पार्स करने और डेटाबेस में डालने के बाद, एल्गोरिथम को लागू करने की तुलना में क्वेरी लिखना संभव है। उस ने कहा, यदि आप इसे कोड करना चाहते हैं, तो आप जिस एल्गोरिथ्म को चाहते हैं, वह अंतर है और C ++ STL में एक कार्यान्वयन है जिसे आप एक बार में एक ही पंक्ति में करने के लिए उपयोग कर सकते हैं, जब आप डेटा के दोनों सेट कंटेनर में डाल देंगे। आपकी पसंद, शायद ए Vector
डेविस्लोर

0

वैकल्पिक विचार:

  1. किसी प्रकार की डेटा संरचना, जैसे कि एक सरणी में लेन-देन की अपनी सूची को पार्स करें। (C ++ में, सोचो Vector, और जावा में, ArrayList)

  2. अपने SQL बैकएंड पर एक क्वेरी करें जैसे कि SELECT DISTINCT customer_id FROM Transactions ORDER BY customer_idसेट किए गए अलग ग्राहक आईडी को सेट में पैक करें old। यदि आप WHEREपुराने और नए लेनदेन को अलग करने वाले खंड के साथ सटीक कार्य करते हैं , तो आप चरण 3 को छोड़ सकते हैं।

  3. नए ग्राहकों से एक अलग डेटा संरचना में, क्रमबद्ध क्रम में अद्वितीय ग्राहक आईडी प्राप्त करें। आप प्राप्त करने के लिए एक डेटा संरचना में है इस्तेमाल कर सकते हैं डेटा संरचनाओं की एक जोड़ी, कर रहे हैं new। एक डबल-लिंक्ड सूची में प्रविष्टि सॉर्ट बहुत सरल है, लेकिन एक मध्यवर्ती हैशटेबल का उपयोग करके रैखिक समय के करीब चलेगा, या यदि आप किसी भी तरह से मूल सरणी को सॉर्ट कर रहे हैं, तो उसमें से एक सेट प्राप्त करना आसान है।

  4. सेट अंतर लें new- oldअपनी पसंदीदा भाषा के मानक पुस्तकालय का उपयोग करें। आपकी पसंदीदा भाषा में यह मानक लाइब्रेरी में एल्गोरिथम है?

अपने लेन-देन डेटाबेस को अपडेट करने के बाद अन्य चीजें जो आप करना चाहते हैं, वे निश्चित रूप से SQL क्वेरी हैं।

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


1
मुझे ग्राहकों के बजाय नए / समान / अद्यतन संसाधनों में अधिक रुचि है । लेकिन हां, विचार समान होगा।
स्वार्ट्ज

0

जैसा कि मैं आपके प्रश्न से समझता हूं कि आपके पास वास्तव में रिसोर्स_ड (+ जानकारी) और ग्राहक की "सूची" (आईडी + जानकारी) है।

तो आप आसानी से प्रति संसाधन ग्राहक की सूची रख सकते हैं और संसाधन पर प्रत्येक सूची में अंतिम नोड की जांच कर सकते हैं (अंतिम ऑपरेशन समय जानने के लिए; आपको बस कोड में अपने ग्राहक को दिनांक फ़ील्ड जोड़ना होगा)

मैं एसक्यूएल से परिचित नहीं हूं, इसलिए मैं अपना उदाहरण देता हूं HashMapऔर सूची के साथ लेकिन मुझे यकीन है कि यह एक ही विचार है: HashMap <Resource, List<Customer>>जब Resourceकुंजी के रूप में रिसोर्सआईडी Customerहोना चाहिए और ग्राहक आईडी, जानकारी और ऑपरेशन की तारीख होनी चाहिए।

इस विचार से आप आसानी से अंतिम ऑपरेशन का समय जान सकते हैं और किसी भी संसाधन को जोड़ सकते हैं (संसाधन हटाएं \ _ ग्राहक जोड़ें)।


0

यदि आप SqLite डेटाबेस का उपयोग कर रहे हैं, यदि आप बैच की तारीख भी तालिका के एक स्तंभ के रूप में जोड़ते हैं,

10| Title X       | 1 | Bob    | 2015-03-01
11| Another title | 1 | Bob    | 2015-03-01
...............................
10| Title X       | 1 | Alice  | 2015-03-05

पिछले दिनों की एक्स संख्या में उपयोग नहीं किए गए संसाधनों को प्राप्त करने के लिए SQL का उपयोग करना बहुत आसान होगा

Select distinct r.ResourceID from Resources r
where not exists (SELECT julianday('now') - julianday(r.DateUpdated)) < X

मैंने एसक्यूएल का परीक्षण नहीं किया है, लेकिन यह आपको एक विचार देना चाहिए


0

मूल पोस्ट से, ऐसा लगता है कि डेटा को अंतर्ग्रहण किया जा रहा है, लेन-देन की तारीख / समय को इंगित करने के लिए एक फ़ील्ड नहीं है, और मुझे लगता है कि फ़ाइल को एक अनुसूची के आधार पर एक दैनिक, प्रति घंटा, आदि के रूप में लिया जाता है।

मैं इसे SQL टाइमस्टैम्प कॉलम जोड़कर संभालूंगा, जो या तो डेटाबेस स्तर पर ऑटोगेनेरेटेड है, या उस कोड द्वारा जो डेटा को निकालता है और डीबी में सम्मिलित करता है। फिर आप उस टाइमस्टैम्प कॉलम पर एक इंडेक्स डालते हैं और उसके साथ किया जाता है। "इस समय से कितने लेन-देन नहीं हुए हैं", या "इस समय और उस समय के बीच कितने हैं" इस सवाल का जवाब देने के लिए डीबी इंजन को इसे कुशल बनाने का काम करने दें।

फिर आप उस कार्य को क्वेरी और गणना करने के लिए शेड्यूल करते हैं, जिस पर आप रिपोर्ट करना चाहते हैं। लेन-देन जो "नए" हैं, वे लेनदेन हैं जो डीबी में आपके द्वारा "नया कब से" पूछ रहे हैं, उससे पहले कोई रिकॉर्ड नहीं है। पुराने रिकॉर्ड वे हैं जिनकी कट-ऑफ तारीख के बाद से कोई लेन-देन नहीं हुआ है।


-2

क्या यह हैशटेबल्स के लिए नहीं हैं? यदि आप चाहते हैं कि पिछले महीनों में किन संसाधनों का उपयोग किया गया है और पिछले 18 महीनों में एक्सेस नहीं किए गए संसाधनों को हटाएं, तो आप एक हैशटेबल का उपयोग कर सकते हैं, जहां कुंजी रिसोर्स_ड है और मान है अंतिम अभिगमन तिथि

> 18 महीनों के अभिलेखों को संग्रहित करने के लिए आप हैश तालिका के सभी रिकॉर्डों से गुजर सकते हैं और उन विशिष्ट रिकॉर्डों को हटा सकते हैं (या स्थानांतरित कर सकते हैं)। (रिपोर्ट आने पर आप इसे साप्ताहिक कर सकते हैं)


अगर मैं डेटाबेस में सामान संग्रहीत कर रहा हूं तो हैशटेबल की आवश्यकता क्यों है? मैं db रिकॉर्ड में अपडेट कर सकता हूं। मुझे एक मामले में अधिक दिलचस्पी है: दो डेटा सेट लें, दो सेटों के बीच अंतर (क्या जोड़ा गया है, वही रहता है, हटाए गए) का पता लगाएं। कैसे एक हैशटेबल तकनीक नए और "हटाए गए" रिकॉर्ड खोजने में सहायता करेगी?
स्वार्ट्ज

यदि तालिकाएँ डेटाबेस में अनुक्रमित की जाती हैं, तो वे मूल रूप से पर्दे के पीछे हैशटेबल्स भी होती हैं। यदि आपके पास 2 टेबल हैं, तो प्रत्येक डेटा सेट का प्रतिनिधित्व करता है तो आप कुछ बाहरी जुड़ाव करके अपने नए और हटाए गए रिकॉर्ड प्राप्त कर सकते हैं। संदर्भ के लिए इस देखें: i.stack.imgur.com/pxUO3.png । सुनिश्चित करें कि आपके पास resource_id कॉलम पर अनुक्रमित हैं और यह बहुत जल्दी होना चाहिए। यदि आपको इसे स्क्रैच से लागू करना था तो मुझे लगता है कि हैशटेबल्स अभी भी जाने का रास्ता होगा क्योंकि आप O (1) में परिशोधन समय में लुकअप / इंसर्शन / डिलीशन कर सकते हैं। ऐसा करने के लिए अधिक कुशल तरीका नहीं सोच सकते।
एड्रियन बूजिया

3
बेहतर डेटा संरचनाएं हैं जो उम्र बढ़ने को संभालने के अतिरिक्त चरणों को बिना हैश तालिका में समेटे हुए हैं।

कुछ का उल्लेख करने के लिए देखभाल?
एड्रियन बुज़िया

@Snowman - काश मैं दर अप कर सकता है कि कुछ ही अधिक बार, मैं सिर्फ जोरदार ढंग से होगा इस टिप्पणी में इस बात से सहमत
जे-बॉस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.