Optimization Kotlin中大列表的加速过滤

Optimization Kotlin中大列表的加速过滤,optimization,kotlin,Optimization,Kotlin,我有一个ArrayList,大约有4000对s(网格上的点)。 在某一点上,我需要得到某个x和y坐标范围内的点 到目前为止,我的代码是: val points: ArrayList = // ... val xRange: IntRange = x: Int - spacingX: Int .. x: Int + spacingX: Int val yRange: IntRange = y: Int - spacingY: Int .. y: Int + spacingY: Int val

我有一个
ArrayList
,大约有4000对
s(网格上的点)。
在某一点上,我需要得到某个x和y坐标范围内的点

到目前为止,我的代码是:

val points: ArrayList = // ...

val xRange: IntRange = x: Int - spacingX: Int .. x: Int + spacingX: Int
val yRange: IntRange = y: Int - spacingY: Int .. y: Int + spacingY: Int

val nearPoints: ArrayList<Point<Int, Int>> = points.filter { xRange.contains(it.first) && yRange.contains(it.second) }
val点:ArrayList=/。。。
val xRange:IntRange=x:Int-spacingX:Int。。x:Int+间距x:Int
val yRange:IntRange=y:Int-间距:Int。。y:Int+间距:Int
val nearPoints:ArrayList=points.filter{xRange.contains(it.first)&&yRange.contains(it.second)}
这比遍历整个列表要快得多,但我希望能进一步加快这个过程


是否可以通过另一个构造更快地获得
近点:ArrayList
?我已经读过
序列
,但它似乎更适合于多个操作,而不是纯粹的过滤。

使用
数组列表
可以保证迭代时恒定的时间复杂度O(1)(每个访问的元素),因为
包含
内部页面
已经进行了范围检查

override fun contains(value: Int): Boolean = first <= value && value <= last

override fun contains(value:Int):Boolean=first使用
ArrayList
可以保证迭代时恒定的时间复杂度O(1)(每个访问的元素),因为
contains
已经进行了范围检查

override fun contains(value: Int): Boolean = first <= value && value <= last

override-fun-contains(value:Int):Boolean=firstKotlin中的
序列使流程工作缓慢。在JVM级别,您将有一个类,如
Iterable
,它将使用ArrayList中的迭代器应用过滤器

最好是在真实数据上分析代码(但4000项可能根本不多),看看瓶颈在哪里

您需要将点放置到ArrayList中。这意味着你根本不需要懒惰。我会投票在ArrayList上使用
.filter{..}
内联函数。lambda被内联到代码中,在这种情况下,每个元素没有方法调用。检查字节码。也许,您甚至可以用比较来替换范围


如果您需要更高的速度,您可以尝试使用基本类型替换ArrayList>,例如使用
IntArray
LongArray
(您可以将两个
Int
编码为一个
Long
。但是,请在之前分析现有代码,Kotlin中的
序列会使流程延迟工作。在JVM级别,您将有一个类似
Iterable
的类,它将使用ArrayList中的迭代器来应用过滤器

最好是在真实数据上分析代码(但4000项可能根本不多),看看瓶颈在哪里

您需要将点放入ArrayList。这意味着您根本不需要惰性。我会投票使用
.filter{..}
ArrayList上的内联函数。lambda被内联到代码中。在这种情况下,每个元素没有方法调用。检查字节码。也许,您甚至可以用比较替换范围


如果您需要更高的速度-您可以尝试使用基本类型替换ArrayList>,例如使用
IntArray
LongArray
(您可以将两个
Int
编码为一个
Long
。但是请在前面分析现有代码,对不起,它是O(N),其中N是迭代列表的列表大小(你需要从那里检查每一项)。你说的O(1)到底是什么意思?Thx!我澄清了!抱歉,但它是O(N),其中N是列表的大小以迭代列表(你需要从那里检查每一项)。你说的O(1)到底是什么意思?Thx!我澄清了!我试图过滤列表的部分(测试列表1000000个元素的大小)同时使用协同程序,但不幸的是,与您现在的操作方式相比,没有加速,但实际上有一点慢。因此,我认为您的操作方式已经非常好。我尝试过滤列表的部分内容(测试列表1000000个元素的大小)同时使用协同程序,但不幸的是,与您现在的方式相比,没有加速,但实际上有减速。所以我认为您的方式已经非常好了。