एक क्रमबद्ध पाठ फ़ाइल में द्विआधारी खोज


13

मेरे पास एक बड़ी सॉर्ट की गई फ़ाइल है जिसमें अरबों लाइनों की चर लंबाई है। एक नई लाइन को देखते हुए मैं यह जानना चाहूंगा कि अगर यह सॉर्ट की गई फ़ाइल में शामिल हो जाती है तो कौन सी बाइट नंबर मिलेगा।

उदाहरण

a\n
c\n
d\n
f\n
g\n

इनपुट 'फू' को देखते हुए मुझे आउटपुट 9 मिलेगा।

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

क्या इस तरह का टेक्स्ट प्रोसेसिंग टूल पहले से मौजूद है?

संपादित करें:

अब यह होता है: https://gitlab.com/ole.tange/tangetools/blob/master/bsearch/bsearch


वह कितनी लंबी पंक्ति है जिसे आप (पात्रों में) खोज रहे हैं? और आपको ऐसी कितनी लाइनों की खोज करने की आवश्यकता है?
गोगौड

@gogoud मैं एक सीमित टूल की तलाश नहीं कर रहा हूं, लेकिन वह जो किसी भी टेक्स्टफाइल पर काम करता है (कोई फर्क नहीं पड़ता कि लाइन की लंबाई या लाइनों की संख्या)।
ओले तांगे

उन लोगों के लिए जो इस तरह के विशाल इनपुट उत्पन्न करना पसंद कर सकते हैं: unix.stackexchange.com/a/279098/9689
Grzegorz Wierzowiecki

जवाबों:


4

मुझे ऐसा करने वाले कुछ मानक उपकरण के बारे में पता नहीं है। हालाँकि आप अपना लिख ​​सकते हैं। उदाहरण के लिए निम्नलिखित रूबी लिपि को कार्य करना चाहिए।

file, key = ARGV.shift, ARGV.shift
min, max = 0, File.size(file)

File.open(file) do |f|
  while max-min>1 do
    middle = (max+min)/2
    f.seek middle
    f.readline
    if f.eof? or f.readline>=key
      max = middle
    else
      min = middle
    end
  end
  f.seek max
  f.readline
  p f.pos+1
end

यह थोड़ा मुश्किल है क्योंकि तलाश के बाद आप आमतौर पर कुछ लाइन के बीच में होते हैं और इसलिए निम्न लाइन की शुरुआत के लिए एक रीडलाइन करने की आवश्यकता होती है, जिसे आप पढ़ सकते हैं और अपनी कुंजी की तुलना कर सकते हैं।


क्या यह स्वीकार करने के लिए बदल दिया जा सकता है -n / -r द्वारा sort -rऔर द्वारा सॉर्ट की गई फ़ाइलों को संसाधित करने के लिए sort -n?
ओले तांगे

उपरोक्त कोड मुख्य रूप से विचार दिखाने के लिए है। यह एकदम सही है। (उदाहरण के लिए यदि कुंजी पहले स्थान पर जाती है तो यह विफल रहता है।) अपनी आवश्यकताओं के अनुकूल होने के लिए स्वतंत्र महसूस करें।
19

5

(यह आपके प्रश्न का सही उत्तर नहीं है, केवल एक प्रारंभिक बिंदु है।)

मैंने इसी तरह की स्थिति में sgrep (सॉर्ट किए गए grep) का उपयोग किया ।

दुर्भाग्य से (हमें वर्तमान स्थिति की आवश्यकता है) इसमें बाइट-ऑफ़-आउटपुट नहीं है; लेकिन मुझे लगता है कि इसे आसानी से जोड़ा जा सकता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.