类似于阵列的数据结构在插入和插入方面是有效的。找时间

时间:2011-05-05 14:41:09

标签: ruby performance data-structures

我需要一个以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的内在数据类型,因此我不知道我是否正确。

可能是托管此类任务的数据结构太天真了。 所以任何人都可以分享一个很棒的。

2 个答案:

答案 0 :(得分:1)

您可能希望了解越来越多的开源NoSQL解决方案,包括MongoDB,Cassandra,Kyoto Cabinet或Redis。

MongoHQ为MongoDB提供免费托管服务。 RedisToGo为Redis提供免费托管服务。两者都非常容易使用Ruby绑定。我使用过它们并推荐它们。

我听说过Cassandra和Kyoto Cabinet的好东西,但没有在任何制作应用程序中使用它们。

答案 1 :(得分:1)

如果正如Phrogz建议您设法获得370GB内存,或者您意识到实际上并不需要存储那么多URL,则可能需要考虑使用SortedSet