在数组中查找最大值,从索引的两侧增加值
Finding max value in array with increasing values from either side of an index
我正试图解决一个需要在数组中找到最大值的问题。数组不能被蛮力搜索,因为它非常大(超过100,000,000个元素),所以我试图创建一个修改版本的二进制搜索来找到最大值。
数组的具体属性有:
- 数组是圆形的
- 从数组中最小值的索引开始,所有超过该索引的值将增加或保持不变,直到最大值的索引。从这里的值将保持不变或减少
- 最小值的指数与最大值的指数相反
一些数组的示例如下(所有等效数组):
-
{1, 2, 3, 4, 5, 5, 4, 3, 2, 1}
-
{5, 4, 3, 2, 1, 1, 2, 3, 4, 5}
-
{3, 4, 5, 5, 4, 3, 2, 1, 1, 2}
谁有办法在大约O(logN)的时间内解决这个问题?
数组值的计算方法:
unsigned long long calculateArrayValue(unsigned long long location, unsigned long long n, unsigned long long arrayLength, unsigned long long* arrayIndices, unsigned long long* locationMagnitude) {
unsigned long long value = 0;
unsigned long long halfArrayLength = arrayLength/ 2;
unsigned long long difference;
for (unsigned long long i = 0; i < n; i++) {
if (arrayIndices[i] > location) {
difference = arrayIndices[i] - location;
} else {
difference = location - houseLocations[i];
}
if (difference > halfArrayLength ) {
difference = arrayLength - difference;
}
value += difference * locationMagnitude[i];
}
return value;
}
如果你允许n-1倍相同的数字和1倍更大的数字的列表,例如
5 5 5 5 5 5 5 5,
那么我断言,一般来说,你不能在O(log n)时间内解决这个问题,因为这个问题相当于在
中搜索一个10 0 0 0 0 0 0 0 1 0
所以你在一个无序列表中有效地搜索一个特定的条目,这需要O(n)时间。
当然,在特殊情况下,你可以加快算法的速度,例如,通过将线性搜索与二进制搜索相结合,允许你跳过列表中严格递减的子序列。
下面的解决方案是错误的,见注释
伪代码:
int next (int i) {
return i + 1 < length ? i + 1 : 0;
}
int prev (int i) {
return i - 1 < 0 ? length : i - 1;
}
int lower = 0;
int upper = length - 1;
int tmp;
while (true) {
tmp = (upper + lower) / 2;
if ( (ary [prev(tmp)] <= ary [tmp]) && (ary [next(tmp)] <= ary [tmp]) ) break;
if ( ary [prev(tmp)] <= ary [tmp] ) {
lower = tmp;
} else if ( ary [next(tmp)] <= ary [tmp] ) {
upper = tmp;
} else {
/* we have found a minimum! */
tmp = length - 1 - tmp;
break;
}
}
int maximum_index = tmp;
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 将转换字符键入 int 以用作向量C++的索引
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 如何为圆环创建索引
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 查找字符在两个索引之间出现的次数
- Azure Kinect 使用正文索引映射裁剪正文
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 数组索引重载错误
- 在数组中查找最大值,从索引的两侧增加值