在JSON文件中实现搜索操作的有效方法

时间:2018-07-20 19:26:09

标签: ruby algorithm performance search

我有一个巨大的JSON文件,该文件是包含城市犯罪信息的对象的数组。每个城市的犯罪数量列为键/值。我正在使用yajl / json_gem将其解析为哈希。 找到犯罪率最高/犯罪率最低的十大城市的有效方法是什么?

3 个答案:

答案 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)

使用findselect查找所需的数字,排序并取10个第一个对象

h.find { |el| el.crime_rate > 500 }.first(10)#或任何其他条件