[英]Using Ruby, what is the most efficient way to check if any key in a hash matches any values within an Array
我想將參數散列中的鍵與元素數組進行匹配。
例如:
params = {"key1", "key2", "key3"}
params_to_match = ["key2","key3"]
我可以這樣做,但是我敢肯定,有一種更優雅的方法可以達到相同的結果
params.each_key{|key|
if params_to_match.include?(key.to_s)
return
end
}
不一定更有效,但在某種意義上也許更優雅 :
return unless (params.keys & params_to_match).empty?
比您的示例更有效的方法(在一般情況下,不一定是這么小的玩具示例)是檢查哈希是否包含鍵,因為從數組中查找鍵的時間實際上是恆定的是O(n)。 因此,您的示例將變成這樣:
params_to_match.each { |p| return if params.has_key?(p) }
我認為優雅與高效的最佳結合是
return if params_to_match.any? { |p| params.has_key?(p) }
如果您有ActiveSupport,則可以
return if params.slice(*params_to_match).any?
這是psedudocode中的一種快速算法。
assert keys, input are sorted
pos = beginning of keys
for i in input
pos = keys.find(pos, i) # find() starts search at position pos
if not_found(pos) then return false
++pos
return true
假設首先對鍵和輸入進行排序,該算法執行O(n + m),n和m是鍵和輸入的計數。 我將其留給您將其翻譯為Ruby,但請密切注意find()
函數; 它必須在上一次迭代中找到的位置開始搜索,而不是在鍵的開頭開始搜索。 否則,您將獲得鍵數量為O(n ^ 2 + m),n。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.