我有一个巨大的JSON文件,该文件是包含城市犯罪信息的对象的数组。每个城市的犯罪数量列为键/值。我正在使用yajl / json_gem将其解析为哈希。 找到犯罪率最高/犯罪率最低的十大城市的有效方法是什么?
答案 0 :(得分:2)
通常,遍历列表以找到k
最小或最大元素的有效方法是使用最小或最大堆。 heap是树状的数据结构,始终在树的顶部具有最小或最大的元素,而插入新元素或删除元素则为O(log n)
。
比方说,您的表中有N个元素,并且希望跟踪k个max元素(最小过程相同,只使用一个不同的堆)。对于this StackOverflow post,将数据存储在大小为k的最大堆中(并且丢弃的值小于堆中的最小值)是解决此问题的有效方法。
空间复杂度为O(n)
(对于表中的每个元素,堆中只有一个元素),时间复杂度为O(n log k)
(因为必须插入n
元素最坏的情况,并且每个元素都花费log k
时间)。
现在,继续实现:Ruby没有Heap数据结构,但是gem algorithms
具有用C实现的堆。
我不想为您编写代码,但我认为从这一理论出发,您应该能够实现有效的解决方案。
答案 1 :(得分:2)
由于问题尚不清楚,我不希望这是一个完整的答案,但这可能提供解决方案的起点。
假设
h = { "info":[
{"name": "Paris", "crime_rate": "750"},
{"name": "Rome", "crime_rate": "800"},
{"name": "London", "crime_rate": "600"},
{"name": "Berlin", "crime_rate": "400"},
{"name": "Amsterdam", "crime_rate": "700"}
]
}
以及犯罪率最高的两个城市和最低的两个城市是理想的。
def top_so_many(h, meth, nbr)
h[:info].public_send(meth, nbr) { |g| g[:crime_rate] }.map { |g| g[:name] }
end
top_so_many(h, :max_by, 2)
#=> ["Rome", "Paris"]
top_so_many(h, :min_by, 2)
#=> ["Berlin", "London"]
答案 2 :(得分:0)
我会尝试这样的事情:
将JSON存储在变量中
json = {"info":[ {"name": "xyz", "crime_rate": 750}, {"name":"ABC", "crime_rate", "900"}......]}
解析JSON:
h = JSON.parse(s)
使用find
或select
查找所需的数字,排序并取10个第一个对象
h.find { |el| el.crime_rate > 500 }.first(10)
#或任何其他条件