In 计算问题我发现了这个有趣的线性搜索实现(它实际上是我的 Java 实现;-)):
public static int linearSearch(int[] a, int key) {
int high = a.length - 1;
int tmp = a[high];
// put a sentinel at the end of the array
a[high] = key;
int i = 0;
while (a[i] != key) {
i++;
}
// restore original value
a[high] = tmp;
if (i == high && key != tmp) {
return NOT_CONTAINED;
}
return i;
}
它基本上使用哨兵,即搜索的值,以便您始终找到该值,而不必检查数组边界。最后一个元素存储在临时变量中,然后哨兵被放置在最后一个位置。当找到该值时(请记住,由于哨兵,它总是被发现),原始元素将被恢复,并检查索引是否代表最后一个索引并且不等于搜索到的值。如果是这种情况,则返回 -1 (NOT_CONTAINED),否则返回索引。
虽然我发现这个实现非常聪明,但我想知道它是否真的有用。对于小数组,它似乎总是更慢,而对于大数组,只有在找不到值时,它似乎才更快。有任何想法吗?
EDIT
最初的实现是用 C++ 编写的,因此可能会有所不同。
它不是线程安全的,例如,您可能会失去您的a[high]
通过在第一个线程更改后启动第二个线程来获取值a[high]
to key
,所以会记录key
to tmp
,并在第一个线程恢复后完成a[high]
至其原始值。第二个线程将恢复a[high]
到它第一次看到的内容,即第一个线程的key
.
它在 java 中也没有什么用处,因为 JVM 将包括对数组的边界检查,因此 while 循环会检查您是否不会超出数组的末尾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)