2012-11-16 34 views
6

से तार का एक सबसेट रिटर्निंग मेरे कॉलेज खत्म हो रही है तो मैं साक्षात्कार के लिए तैयारी कर नौकरी पाने के लिए शुरू कर दिया और मैं जब तक मैं साक्षात्कार10000 ascii तार

    के लिए तैयारी कर रहा था इस साक्षात्कार प्रश्न में आए
  1. आपके पास 10000 एसीआई स्ट्रिंग्स (फ़ाइल से लोड किया गया) का सेट है
  2. स्ट्रिंग से एक स्ट्रिंग इनपुट है।
  3. एक स्यूडोकोड लिखें जो (1) में स्ट्रिंग्स के एक सबसेट (stdout) को लौटाता है जिसमें इनपुट (2) के रूप में समान वर्ण (ऑर्डर के बावजूद) होते हैं। समय के लिए अनुकूलित करें।
  4. मान लें कि इस फ़ंक्शन को बार-बार उपयोग करने की आवश्यकता होगी। एक बार स्ट्रिंग सरणी शुरू करना और स्मृति में संग्रहीत करना ठीक है। कृपया उन समाधानों से बचें जिन्हें सभी 10000 तारों के माध्यम से लूपिंग की आवश्यकता होती है।

किसी को भी मुझे एक सामान्य स्यूडोकोड/एल्गोरिथ्म बात की है कि कैसे इस समस्या को हल करने प्रकार प्रदान कर सकते हैं? मैं समाधान के बारे में सोचने के लिए अपने सिर खरोंच कर रहा हूँ। मैं ज्यादातर जावा से परिचित हूं।

+0

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

+1

एक डेटा संरचना तैयार करें जो तारों की सूची में विशिष्ट वर्णों को मैप कर सकती है (हैश तालिका, पहुंच 'ओ (1) 'है)। एक बार आपके पास उस डेटा संरचना के बाद, शेष छोटा होता है। –

+0

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

उत्तर

6

यहां एक ओ (1) एल्गोरिदम है!

प्रारंभ:

  • प्रत्येक स्ट्रिंग, तरह पात्रों के लिए, को हटाने के डुप्लिकेट - जैसे "पेड़" बन जाता है "एक ज़माने में"
  • लोड क्रमबद्ध वर्ण का उपयोग करके trie पेड़ में शब्द अनुसार क्रमबद्ध, के लिए एक संदर्भ जोड़ने प्रत्येक नोड पर संग्रहित शब्दों की सूची के लिए मूल शब्द चल

खोज:

  • तरह इनपुट स्ट्रिंग स्रोत स्ट्रिंग के लिए प्रारंभ के रूप में ही
  • सभी शब्दों
  • पालन स्रोत स्ट्रिंग trie अक्षरों का उपयोग, अंत नोड पर, लौट वहाँ संदर्भित
+0

यह जोड़ना उचित है कि यदि पात्रों के संभावित मूल्यों की सीमा काफी प्रतिबंधित है तो आपको वर्णों को सॉर्ट करने की आवश्यकता नहीं है: आप केवल यह अनुमान लगा सकते हैं कि प्रत्येक में से कितने होते हैं। आपकी कुंजी तब उन ऑब्जेक्ट्स वाली ऑब्जेक्ट हो सकती है, या क्रमशः गणना की गई गणनाओं का एक मजबूत हैश हो सकता है। इस तरह की समस्या आंशिक रूप से मैं एक और टिप्पणी में कहता हूं कि "समय के लिए अनुकूलित" करने के लिए आपको वास्तव में इनपुट डेटा की तरह दिखने के बारे में अधिक जानकारी चाहिए। –

+1

@NeilCoffey मैं असहमत हूं इसे हल करने की आवश्यकता है। संपादित उत्तर देखें - मैंने एल्गोरिदम में सुधार (निश्चित) किया। यह अब चट्टानों :) – Bohemian

+0

आह, ठीक है, अगर आप एक फ्लैट हैश मानचित्र के बजाय एक trie का उपयोग करें, तो हाँ प्रभावी ढंग से यह करता है।(संभावित रूप से, ट्राई के नोड्स चरित्र की गणना हो सकते हैं, लेकिन उस समय मुझे लगता है कि आप एक फ्लैट मैप के साथ जिस विधि का उल्लेख करते हैं उसका उपयोग भी कर सकते हैं।) –

0

वे कहते हैं कि समय के लिए अनुकूलित है, इसलिए मुझे लगता है कि हम कर रहे हैं जितना चाहें उतना दुरुपयोग अंतरिक्ष के लिए सुरक्षित।

उस स्थिति में, आप 10000 तारों पर प्रारंभिक पास कर सकते हैं और 10000 में मौजूद प्रत्येक अद्वितीय वर्णों से उनके मैपिंग (बल्कि उनके सूचकांक का एक सेट) में मैपिंग का निर्माण कर सकते हैं। इस तरह आप सवाल मैपिंग से पूछ सकते हैं, जिसमें सेट 'एक्स' होता है? इस मैपिंग एम को कॉल करें> (ऑर्डर: ओ (एनएम) जब एन स्ट्रिंग्स की संख्या है और एम उनकी अधिकतम लंबाई है)

समय में फिर से अनुकूलित करने के लिए, आप विशिष्ट वर्णों में stdin इनपुट स्ट्रिंग को कम कर सकते हैं, और उन्हें डाल सकते हैं एक कतार में, क्यू (ऑर्डर ओ (पी), पी इनपुट स्ट्रिंग की लंबाई है)

एक नया डिस्जिइंट सेट शुरू करें, एस कहें। फिर एस = क्यू .extractNextItem दें।

अब आप शेष अद्वितीय पात्रों पर लूप कर सकते हैं और यह पता लगा सकते हैं कि कौन से सेट उनमें से सभी हैं।

जबकि (क्यू खाली नहीं है) {

एस = एस एक दूसरे को काटना प्र (ओ (पी) लूप)extractNextItem

}

देखा (ओ (1) संबंध तोड़ना सेट के अपने कार्यान्वयन के आधार पर पास करने के लिए), लौट एस

कुल समय: ओ (MN + पी + पी * 1) = ओ (एम.एन. + पी)

(फिर भी सुबह यहां के शुरू में, मुझे आशा है कि समय विश्लेषण सही था)

+1

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

+0

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

0

बोहेमियन कहते हैं, एक Trie पेड़ निश्चित रूप से जाने का रास्ता है!

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

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

  • कोई संबंधित समस्या नहीं^_^