C中数组的问题

时间:2013-02-14 18:51:17

标签: c arrays algorithm

给定一个移位的数组(例如):

[17 34 190 1 4]

从(我们不知道原创)转移

[1 4 17 34 190]

找到该数字的位置会有什么好处?

例如,如果我通过1,它将返回第3位。

2 个答案:

答案 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 你知道在原始数组中一个元素是第五个,现在是第七个,你要找的元素是第二十三个,你可以回答“第二十五”没有实际上将阵列扫描到第二十五个位置,这可能是整个练习的重点。但要建立这样的解决方案,人们需要更多地了解这个问题。