यदि आप एक बड़े डेटा सेट के साथ काम कर रहे हैं, तो मैं इसे एक ट्राई के रूप में लागू करने पर विचार करने का सुझाव दूंगा। मैंने रूबी का एक छोटा सा टुकड़ा एक साथ फेंका है जो ऐसा करेगा:
require 'rubygems'
require 'redis'
class RedisTrie
TERMINAL = '+'
def initialize(prefix)
@prefix = prefix
@r = Redis.new
end
def add_word(word)
w = word.gsub(/[^a-zA-Z0-9_-]/, '')
key = "#{@prefix}:"
w.each_char do |c|
@r.zset_add key, c.bytes.first, c
key += c
end
@r.zset_add key, 0, TERMINAL
end
def add_words(*words)
words.flatten.compact.each {|word| add_word word}
end
def suggest(text)
@r.zset_range("#{@prefix}:#{text}", 0, -1).map do |c|
(c == TERMINAL) ? text : suggest(text + c)
end.flatten
end
end
rt = RedisTrie.new('trie')
rt.add_words %w( apple automobile carwash oil-change cranky five ruthie axe auto )
p rt.suggest(ARGV.shift.to_s)
उदाहरण के लिए:
$ ruby RedisTrie.rb
["apple", "auto", "automobile", "axe", "carwash", "cranky", "five", "oil-change", "ruthie"]
$ ruby RedisTrie.rb a
["apple", "auto", "automobile", "axe"]
$ ruby RedisTrie.rb au
["auto", "automobile"]
$ ruby RedisTrie.rb aux
[]
कोशिशों पर विकिपीडिया की प्रविष्टि पर कोशिशों के बारे में और पढ़ें।
आप निश्चित रूप से सभी मानों को वापस न करने के लिए अपनी सुझाव विधि को अनुकूलित करना चाहेंगे, इसके बजाय केवल पहले एक्स मानों को वापस कर देंगे। यह संपूर्ण डेटा संरचना को पुनरावृत्त करने के उद्देश्य को विफल कर देगा।