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

Arrays 数组对字典-战斗!什么';搜索大型数据集的最快方法是什么?,arrays,performance,dictionary,swift,mapkit,Arrays,Performance,Dictionary,Swift,Mapkit,给所有计算机科学家打电话-我需要你的专家建议:) 我的问题是: 我有一个地图应用程序,我已经将世界划分为1000万个可能的固定大小的正方形(纬度/经度,即双/双数据类型)。让我们称之为数据集D1 第二组数据称为D2,大约有20000个大小相同的正方形(纬度/经度,或双/双数据类型),表示我的应用程序中感兴趣的位置 当用户放大到足够远时,我希望显示当前视图中所有感兴趣的方块,但不显示视图外的方块,因为这对于应用程序来说太多了,无法处理(生成覆盖图等),而不会完全陷入困境 因此,与其提交2000

给所有计算机科学家打电话-我需要你的专家建议:)

我的问题是:

  • 我有一个地图应用程序,我已经将世界划分为1000万个可能的固定大小的正方形(纬度/经度,即双/双数据类型)。让我们称之为数据集D1
  • 第二组数据称为D2,大约有20000个大小相同的正方形(纬度/经度,或双/双数据类型),表示我的应用程序中感兴趣的位置
  • 当用户放大到足够远时,我希望显示当前视图中所有感兴趣的方块,但不显示视图外的方块,因为这对于应用程序来说太多了,无法处理(生成覆盖图等),而不会完全陷入困境
因此,与其提交20000个叠加方块进行渲染,并让Mapkit框架管理显示的内容(它完全阻塞了那么多数据),不如介绍一些我尝试优化性能的方法:

1) 将D2放入数组中。遍历视图中每个可能的可见方块,并在D2中查找每个可能的方块(使用Swift的find()函数),查看该数组中是否存在相应的元素。如果存在,则显示它。这真的很慢->如果我的视图有4000个可查看的正方形区域,我必须检查4000个正方形*阵列中的20000个点=最多8000万次查找=慢

2) 将D2放入数组中。迭代D2,对于D2中的每个元素,检查该元素是否在我的视图范围内。如果是,则显示它。这比#1好(只需要#1的10%的时间),但仍然是缓慢的

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

我一直在考虑字典或其他数据结构。我是否希望使用key=(纬度、经度)和value=(真/假)填充的字典比数组查找更快?我在想,如果一个地图视图的边界是y2,y1,x2,x1,我可以做一个简单的for{}循环来查找那些边界中value=true(或者甚至没有值;我真正需要的是dictionarydata.exists(x,y)之类的东西,除非构建字典绝对需要一个值)。这会快得多,但这又取决于字典与数组相比的速度

长话短说:在大字典中搜索密钥是否比在数组中搜索快得多?我曾考虑对数组进行排序并构建二进制搜索作为测试,但认为字典可能更有效。由于我的数组D2将随时间动态构建,因此我宁愿每次添加投入更多的时间/资源(本质上是单一的),以便以后绝对最大化查找性能(这是要筛选的数据数量级)


感谢任何/所有的建议-字典是最好的选择吗?还有其他的建议吗?

在这里的评论中引用一些例子。创建沿X轴和Y轴排序的二维数组。然后进行二进制搜索以查找NW角点和SE角点元素。那么,这两个角所形成的框中的所有元素都需要显示出来。

这很容易是XY问题,如果例如“代码> MAPKIT < /代码>实现了一些已经做过的事情(即参见)。考虑至少添加<代码> SWIFT 和<代码> MAPKIT < /Cord>标签(您必须删除2个当前标签)。还考虑缩短问题和增加一个更具体的题目。它看起来是一个相对简单的问题,它可能或可能不需要复杂的解决方案,但是不管它不需要用这么长的时间来描述。至于一般的问题。我猜想最佳的方法是使用一个双重排序的二维数据结构。通过经度和纬度,或者仅通过两个ds。但不确定哪一个特定的ds是最佳的。我同意@BroSlow,2D数据结构可能是最佳的。然后,您可以只计算数据位于哪个索引之间,并传递该索引。如果您想优化缓存,您也可以尝试阻止数据,但我怀疑它是否会带来很多好处增益,除非有数据的重用。哦,这个参考可能会帮助您做出决定:它只说明复杂性,但记住它仍然很重要。