2012-01-21 6 views
14

हाल ही में मुझे एक सरणी के साथ कोई समस्या थी जिसमें कुछ सौ हजार मूल्य थे और केवल एक चीज जो मैं करना चाहता था यह जांचना था कि कोई मान पहले से मौजूद है या नहीं। मेरे मामले में यह एक वेबसर्वर लॉग से आईपी थे। तो मूल रूप से की तरह कुछ: हालांकि देखने समय नाटकीय रूप से वृद्धि हुई है और लुकअप की 10k 17 सेकंड या तो चारों ओर ले लियाPHP में सरणी की तुलना में वैकल्पिक डेटा संरचनाएं हैं, जहां मैं विभिन्न इंडेक्स तकनीकों से लाभ उठा सकता हूं?

in_array(ip2long(ip),$myarray) काम

किया था।

इसलिए इस मामले में मुझे परवाह नहीं था कि मेरे पास डुप्लिकेट है या नहीं, मुझे केवल अस्तित्व की जांच करने की आवश्यकता है। तो मैं इस तरह सूचकांक में आईपी संग्रहीत कर सकती है:

isset($myarray[ip2long($ip)]) 

और बूम, देखने बार नीचे 17 सेकंड (और अधिक) से 0.8 सेकंड के एक स्थिर समय पर 10k लुकअप के लिए चला गया। सरणी प्रविष्टि के लिए एक मान के रूप में मैंने अभी int 1 का उपयोग किया था।

मुझे लगता है कि सरणी सूचकांक शायद कुछ बी-पेड़ पर आधारित है जिसमें लॉग (एन) लुकअप समय और हैशपैप पर इंडेक्स होना चाहिए।

इंडेक्स का उपयोग करते हुए मेरे मामले में ठीक काम किया, लेकिन क्या कोई डेटा संरचनाएं हैं जहां मैं हैशैप्स को वैल्यू इंडेक्स के रूप में उपयोग कर सकता हूं, जहां कई मान भी हो सकते हैं (मुझे एहसास है कि यह केवल तभी समझ में आता है जब बहुत अधिक डुप्लीकेट नहीं होते और मैं रेंज/खोज अनुरोधों का कुशलता से उपयोग नहीं कर सकता, जो वृक्ष संरचनाओं का प्राथमिक लाभ है)?

उत्तर

7

पीएचपी के साथ बंडल SPL library में सरल सरणियों, लिंक किए गए सूची, ढेर, ढेर, कतार, आदि

हालांकि

शामिल करने के अलावा विकल्प datastructures की एक पूरी श्रृंखला रहे हैं, मैं तुम्हें अपने तर्क एक पूरी बहुत कुछ कर सकता है पर शक यदि आप flipped अपनी सरणी को अधिक कुशल बनाते हैं, तो आपको मूल्य की तलाश करने के बजाय कुंजी पर एक लुकअप करने की अनुमति मिलती है (array_key_exists() फ़ंक्शन का उपयोग करके)। सरणी सूचकांक एक btree के बजाय एक हैश है, जो कुंजी के माध्यम से बहुत तेज प्रत्यक्ष पहुंच के लिए बना है।

हालांकि, यदि आप किसी सरणी में 10k प्रविष्टियों के साथ काम कर रहे हैं, तो संभवतः आप डेटाबेस का बेहतर लाभ उठाएंगे, जहां आप अपनी अनुक्रमणिका को परिभाषित कर सकते हैं।

+0

को सही करने के लिए स्वतंत्र महसूस करें कभी-कभी अच्छे समाधान आपके सामने सही होते हैं और आप बस बहुत जटिल सोचते हैं। -- अच्छी तरह से किया। – Smamatti

+0

उसने मुझे जो समझ लिया उससे फ़्लिप किया। –

+0

जारी करने का उपयोग ($ a [$ key]) array_key_exists ($ key, $ a) से अधिक (!) तेज़ है, क्योंकि जारी एक संरचना है और array_key_exists() एक फ़ंक्शन है। – BurninLeo

1

Arrays के अनुक्रमिक क्रम हैं और यह कुछ तत्वों तक पहुंचने में तेज़ी से है, क्योंकि आपको अनुक्रमिक सूची संरचना के माध्यम से पेड़ को पार करने या काम करने की आवश्यकता नहीं है।

एक सेट निश्चित रूप से तेज़ है, क्योंकि आप केवल अद्वितीय तत्वों की जांच करते हैं, न कि सभी तत्वों (सरणी में)।

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

आपको ऐसे पेड़ संरचनाओं के लिए वेब पर नमूना कोड मिलेंगे।

2

आपके पास chdb (निरंतर हैश डेटाबेस) एक्सटेंशन भी है - जो इसके लिए सही है।

1

के रूप में पहले से ही उत्तर दिया, आप ब्रांड नए spl http://www.php.net/spl

द्वारा प्रदान की कक्षाओं का उपयोग कर सकते हैं, लेकिन जाहिरा तौर पर वे जितनी जल्दी लोगों को लगता है नहीं कर रहे हैं। शायद हम उम्मीद नहीं कर रहे हैं क्योंकि हम उम्मीद करते हैं। यह मेरी राय है कि splfixedarray, उदाहरण के लिए, नहीं एक वास्तविक सरणी है, लेकिन क्लासिक php के सरणियों

के रूप में एक hashtable है, लेकिन यह भी, आप कुछ वैकल्पिक समाधान

है पहले आप एक डेटाबेस में अपने परिणाम स्टोर कर सकते हैं। प्रश्नों तेजी क्योंकि db अनुक्रमित बेहतर एक php आंकड़ा संरचना से अनुकूलित किया जा सकता है

आप उपयोग कर सकते हैं एक अस्थायी डेटाबेस में http://www.php.net/sqlite3 और दुकान परिणामों (एक फ़ाइल या स्मृति में)

मैं एक अस्थायी फ़ाइल सुझाव देते हैं, क्योंकि आप डॉन 'हैं टी को सभी को स्मृति में लोड करना होगा, और साथ ही आप प्रत्येक पंक्ति को व्यक्तिगत रूप से जोड़ सकते हैं (उदाहरण के लिए http://www.php.net/fgets का उपयोग करके)

एचटीएच!

मेरी अंग्रेजी

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