在Swift中使用for循环时,如何使在数组中查找项变得更高效



我知道Swift中高阶函数的用例,我知道如何使用它们来解决这样的问题,但在我的问题中,我正在寻找一种不使用那些易于使用的函数的方法,并且我正在努力优化在数组的所有成员中循环时的查找过程。当使用非常大的数组来查找我们正在寻找索引的项时,我可以进行更多的优化以获得更好的性能吗?

func test() {

let array: Array<String> = ["A", "B", "C", "A", "Hello, world!", "B", "C", "Hello", "W"]

for index in array.indices {
if array[index].contains("Hello") {
print(index)
}
}
}

结果:

4

7

您的算法当前为O(n)(暂时忽略contains()的可变运行时间(。

当涉及到在没有约束的数据数组上的搜索算法时,这是最好的。你必须检查每一个元素,没有办法绕过它。

当您有关于数组的更多信息时,可以进行优化。例如,如果对数组进行排序,则可以生成O(log(n))的搜索算法,这会快得多。如果数组的顺序无关紧要,您可以提前对其进行排序,这会很昂贵,但只需要进行一次,而且每次查询都会更快。

另一个优化选项是,如果您知道同一个查询可能会运行多次,则可以缓存结果并重用它们。

你也可以试着变聪明,准备一些";元数据";以便使查找速度更快。

例如,您可以创建一个重复的数组,其中包含数组的排序版本,其中每个元素都包含字符串值及其原始索引,然后使用二进制搜索在O(log(n))中查找匹配的元素,现在索引的速度要快得多。