Мне нужна структура данных, реализованная на языке Ruby
, для размещения огромного количества различных URL-адресов (например, 10**10
штук), поэтому производительность - моя забота.
Я использую Array
и сохраняю его элементы упорядоченными, чтобы я мог выполнить binary search
, чтобы найти, если он уже существует или где быстро вставить URL.
Я написал это:
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, поэтому я не знаю, прав ли я.
Может быть, это настолько наивная структура данных для размещения такой задачи.
Так что любой может поделиться удивительным.