数组与字典 - 战斗!搜索大型数据集的最快方法是什么?

时间:2014-10-23 19:25:47

标签: arrays performance dictionary swift mapkit

致电所有计算机科学家 - 我需要您的专家建议:)

这是我的问题:

  • 我有一个地图应用程序,我将世界划分为1000万个固定大小的可能方块(纬度/经度,即双/双数据类型)。我们称之为数据集D1。
  • 第二组数据,称为D2,大约相同大小的20,000个正方形(纬度/经度,或双/双数据类型),并代表我的应用中感兴趣的位置。
  • 当用户放大到足够远时,我想显示当前视图中所有感兴趣的方块,但不显示视图外的方块,因为应用程序处理的方式太多了(生成叠加层等,而不会完全陷入困境。

因此,不是提交20,000个叠加方块进行渲染,而是让Mapkit框架管理所显示的内容(它完全扼杀了那么多数据),这里有一些我试图优化性能的方法:

1)将D2放入数组中。在我的视图中迭代每个可能的可见方块,并且对于每个可能的方块在D2中进行查找(使用Swift的find()函数)以查看该数组中是否存在相应的元素。如果存在,请显示它。这真的很慢 - >如果我的视图有4000平方的可见区域,我必须检查4000个方格*阵列中的20000个点=高达80万个查找=缓慢..

2)将D2放入数组中。迭代D2并对D2中的每个元素进行迭代,检查该元素是否在我的视图范围内。如果是,请显示它。这比#1好(只占#1的10%),但仍处于慢速

3)将D2放入数组中。迭代D2并创建一个新的数组D3,它过滤掉(使用Swift的array.filter()方法和一个闭包)视图外的所有数据点,然后只提交那些点进行渲染。这是最快的(约为#1原始时间的2%)但仍然太慢(取决于数据模式,仍然需要在iphone4上进行几秒钟的处理)。

我一直在考虑字典或其他数据结构。我是否希望使用key =(纬度,经度)和值=(true / false)填充的字典比数组更快查找?我想是一个带有边界y2,y1,x2,x1的地图视图,我可以做一个简单的{}循环来找到那些边界中的所有字典条目,其值为true(甚至没有值;所有我和#39; d真正需要的是dictionarydata.exists(x,y),除非绝对需要一个值来构建字典)。这会更快,但它又取决于字典与数组的比较速度。

长话短说:正在搜索大字典中的密钥比搜索数组要快得多吗?我打算对我的数组进行排序并构建二进制搜索作为测试,但是想象的字典可能更有效。由于我的数组D2将随着时间的推移而动态构建,因此我宁愿每次添加时提交更多的时间/资源(本质上是单数的),以便以后绝对最大化查找性能(这是数据量级更多的数据来筛选通过)。

欣赏任何/所有建议 - 字典是要走的路吗?还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

在这里的评论中重复示例。创建在X轴和Y轴上排序的二维数组。然后进行二分搜索以找到NW角和SE角元素。然后需要显示由这两个角形成的框中的所有元素。