给定一个移位的数组(例如):
[17 34 190 1 4]
从(我们不知道原创)转移
[1 4 17 34 190]
找到该数字的位置会有什么好处?
例如,如果我通过1,它将返回第3位。
答案 0 :(得分:1)
线性搜索答案总是有效,但我相信你可以在O(日志)时间到达那里。
通过检查移位排序数组的值是否与它所假设的相反,对转换点进行某种二进制搜索。就像创造一个特里。继续形成已排序的树,直到找到“非法”节点(男人这可以掩盖很多细节 - 我知道)。这告诉你拐点在哪里,你现在将数组视为2个排序向量。快速检查查找的值是否大于每个的最大条目,以便我们知道要搜索哪个向量。 BSearch您的值的排序向量并返回其索引。
困难的部分是找到拐点。 :)
答案 1 :(得分:0)
您必须扫描阵列。
size_t pos_in_arr(int *arr, size_t arr_size, int match)
{
size_t i;
for (i = 0; i < arr_size; i++)
if (arr[i] == match)
break;
return i;
}
此函数将返回所要求的位置,或者在找不到元素的情况下返回最大位置。
解决方案是您要求的,但它可能不是您需要的,因为它不会以任何方式使用数组已被移位的事实。我怀疑原来的问题更复杂。
例如 if 你知道在原始数组中一个元素是第五个,现在是第七个,你要找的元素是第二十三个,你可以回答“第二十五”没有实际上将阵列扫描到第二十五个位置,这可能是整个练习的重点。但要建立这样的解决方案,人们需要更多地了解这个问题。