2010-04-19 5 views
8

बुरा अंग्रेजी के लिए खेद है :(खोजेंव्यंजनों कि प्रदान की ingridients से पकाया जा सकता है

मैं प्रारंभिक किसी भी तरह से बनाने की विधि और सामग्री डेटा को व्यवस्थित कर सकते हैं मान लीजिए।
मैं प्रभावी रूप से उपयोगकर्ता द्वारा प्रदत्त सामग्री से व्यंजनों की खोज का संचालन कर सकते हैं कैसे , अधिमानतः अधिकतम मिलान द्वारा क्रमबद्ध किया जाता है - इसलिए, पहली बार उपलब्ध कराए गए व्यंजनों का उपयोग करने वाले व्यंजनों का उपयोग करते हैं और उनमें कोई अतिरिक्त अन्य आवश्यकता नहीं होती है, उनके बाद व्यंजन जो कम उपलब्ध सेट का उपयोग करते हैं और अभी भी कोई अन्य ingrs नहीं, उनके अतिरिक्त न्यूनतम आवश्यकताओं के साथ व्यंजनों के बाद, तो?

पर सभी मैं के बारे में सोच सकते हैं bitmasks तरह नुस्खा ingridients प्रतिनिधित्व करते हैं, और requi तुलना है सभी व्यंजनों के साथ लाल बिटकमास्क, लेकिन यह स्पष्ट रूप से जाने का एक बुरा तरीका है।

और संबंधित बातें Levenstein दूरी की तरह मैं यहाँ का उपयोग कैसे नहीं दिख रहा।

मेरा मानना ​​है कि यह काफी आम कार्य होना चाहिए ...

+1

संदिग्ध रूप से डेटा संरचनाओं या डेटाबेस प्रबंधन वर्ग में होमवर्क समस्या की तरह लगता है। –

+1

क्या आप एक सामान्य एल्गोरिदम के लिए छद्म कोड ढूंढ रहे हैं? आप किस भाषा/तकनीक का उपयोग कर रहे हैं? यदि मैं आपके प्रश्न को सही तरीके से समझता हूं, तो आप अपने प्रश्न को फिर से लिखना चाहेंगे: "सामग्री की सूची दी गई सर्वोत्तम मिलान वाली व्यंजनों को खोजने के लिए मैं क्या एल्गोरिदम लागू कर सकता हूं"? – Armstrongest

+0

एटमिटॉन, हाँ, मैं इस तरह से प्रश्न लिख सकता हूं) मैं perl, SQL, memcached, Redis key-value संग्रहण का उपयोग कर रहा हूं और उस एल्गोरिदम का उपयोग वेबसाइट पर किया जाना था। – skaurus

उत्तर

3

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

यह एक थोड़ा और अधिक जटिल हो जाता है जब आप सामग्री के विभिन्न मात्रा में पता करने के लिए चाहते हैं।

संपादित करें: यदि आपका नुस्खा डेटा SQL डेटाबेस में संग्रहीत है, तो वास्तव में पूरी चीज को SQL क्वेरी के रूप में कुशलतापूर्वक करना संभव है (जो आंतरिक रूप से hastables और पेड़ों का उपयोग करेगा)। लेकिन यह एक सुंदर जटिल सवाल होने जा रहा है; बेहतर मुझसे पूछें जो मेरे से एसक्यूएल में बेहतर है (और निश्चित रूप से आपकी वास्तविक तालिका संरचना आवश्यक है)।

+0

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

+0

@skaurus: पेड़ केवल लॉग (एन) लुकअप समय प्रदान करने के लिए मौजूद है, इसलिए कोई भी संतुलित खोज पेड़ करेगा। आपको इसे स्वयं लागू नहीं करना चाहिए, सभी सामान्य भाषाओं के लिए डेटास्ट्रक्चर पुस्तकालय हैं। यदि आप perl का उपयोग कर रहे हैं, तो हैश भाषा में बनाई गई हैं। –

+0

मैं समझ नहीं पा रहा हूं, मैं उस पेड़ में क्या स्टोर करने जा रहा हूं) – skaurus

2

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

Lucene नेट, जावा, पीएचपी और कई अन्य लोगों सहित कई भाषाओं के लिए कार्यान्वयन के साथ खुला स्रोत है। अधिक जानकारी के लिए यह link देखें। सभी संबंधित परियोजनाओं के लिए उस पृष्ठ पर एक लिंक है।

+0

ओह। या मैं स्फिंक्स का उपयोग कर सकता हूं, MySQL के लिए खोज इंजन ... यह निश्चित रूप से जाने का एक तरीका है, लेकिन मुझे विश्वास है कि इस कार्य के लिए सरल समाधान लागू करके मैं बेहतर प्रदर्शन कर सकता हूं। शायद मैं खोज इंजन एल्गोरिदम के लिए Google कर सकता हूं और कुछ अपनाने सकता हूं? – skaurus

1

बस अनुक्रमण के लिए - मैं कुछ बेंच मार्किंग कर रहा हूँ, और पहली दृष्टिकोण मैं परीक्षण किया है - PostgreSQL प्राप्ति है, सबक्वेरी और intarray प्रकार का उपयोग।

तो, मैं टेबल के साथ पारंपरिक सामान्यीकृत डेटाबेस है
व्यंजनों (आईडी, नाम, descr), पीके (आईडी)
ingridients (आईडी, नाम, descr), पीके (आईडी)
r2i (recipe_id, ingridient_id), अद्वितीय (recipe_id, ingridient_id) (लगता है मुझे नहीं है कि सूचकांक, पूरे मेज पर अपने बराबर की जरूरत है) बस टेबल बड़ा ;-) कुल मिलाकर बनाने के लिए कुछ जंक से भर

नाम और descr कॉलम मैंने 20 के साथ उस टेबल को भर दिया 0 अवयव, 5000 व्यंजनों और प्रत्येक नुस्खा में 3 से 10 अवयव होते हैं, कुल मिलाकर 35k पंक्तियां आर 2i में होती हैं।

मान लीजिए मैं खोज करने के लिए मेरी घटक के लिए व्यंजनों सेट चाहते 129,99,56,180
तरह क्वेरी दिखेगा:

SELECT recipe_id, recipe_ingrs, icount('{129,99,56,180}'::int[] - recipe_ingrs) as shortage, icount(recipe_ingrs - '{129,99,56,180}'::int[]) as excess 
FROM (
    SELECT id as recipe_id, array(select ingridient_id from r2i where r2i.recipe_id = recipes.id)::int[] as recipe_ingrs 
    FROM recipes WHERE recipes.id IN (select distinct recipe_id from r2i where ingridient_id IN (129,99,56,180)) 
) as t 
ORDER BY excess ASC, shortage ASC; 

क्वेरी 7K के बारे में लागत (पर निर्भर करता है आप के लिए क्वेरी सेट), लेकिन मेरी खिड़कियों पर परीक्षण नोटबुक मशीन (c2duo, 2GB RAM के) यह बहुत तेजी से चलाता है - तुरंत मानवीय आँख :)

वहाँ doc available intarray प्रकार के बारे में है के लिए।

परीक्षण अभी तक पूरा नहीं हुआ है, मेरे पास परीक्षण के लिए दो और समाधान हैं, + गति के बारे में कुछ संख्याएं प्राप्त करें।

+0

दो अन्य दृष्टिकोणों का परीक्षण किया। उनमें से एक रेडिस, सिंटर, एसडीआईएफएफ का उपयोग करके नौकरी करने की कोशिश कर रहा है - और यह धीमी गति से धीमी है। अन्य एक - denormalized तालिका bitrecipes (आईडी int, सामग्री int []) के साथ पोस्टग्रेज - सामग्री क्षेत्र intarray प्रकार है। और क्वेरी क्वेरी आईडी को रेसिपी_आईडी, ingridients, icount ('{129,99,56,180}' :: int [] - ingridients) के रूप में संक्षिप्त करें, आईकाउंट (ingridients - '{129,99,56,180}' int []) बिट्रिप्स से जहां ingridients && '{129,99,56,180}' :: int [] अतिरिक्त एएससी द्वारा आदेश, कमी एएससी तालिका में 5k पंक्तियों के लिए लगभग 100 की लागत है। – skaurus

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

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