我需要一个以Ruby
语言实现的数据结构,以容纳大量不同的网址(例如10**10
个),因此性能是我的关注点。
我正在使用Array
并保持其元素有序,因此我可以执行binary search
以查找是否已存在或快速插入网址的位置。
我写了这个:
class UrlStore
def initialize(*args)
@urls = []
args.each { |e| add(e) unless e.class != String }
end
def add(url)
p = find(url)
@urls.insert(p, url) unless p.class == String
end
def find(url)
l, m, h = 0, 0, @urls.size - 1
while l <= h do
m = l + (h - l) / 2
b = url <=> @urls[m]
if b == 0
return m.to_s
elsif b == 1
l = m + 1
else
h = m - 1
end
end
return l
end
end
find
方法,如果找到,将返回托管数组中url的位置,但是以String
形式返回,以便区别找到要插入的位置;否则,返回一个整数(Fixnum
),告诉url应该去哪里保持数组的排序。
但请注意,我使用Array#insert
在指定位置添加元素。我的直觉告诉我,这个方法会在插入点后退一步后移动所有元素,这可能会导致严重的性能推断。 Array
模块不在标准库中,它是Ruby的内在数据类型,因此我不知道我是否正确。
可能是托管此类任务的数据结构太天真了。 所以任何人都可以分享一个很棒的。
答案 0 :(得分:1)
您可能希望了解越来越多的开源NoSQL解决方案,包括MongoDB,Cassandra,Kyoto Cabinet或Redis。
MongoHQ为MongoDB提供免费托管服务。 RedisToGo为Redis提供免费托管服务。两者都非常容易使用Ruby绑定。我使用过它们并推荐它们。
我听说过Cassandra和Kyoto Cabinet的好东西,但没有在任何制作应用程序中使用它们。
答案 1 :(得分:1)
如果正如Phrogz建议您设法获得370GB内存,或者您意识到实际上并不需要存储那么多URL,则可能需要考虑使用SortedSet。