用数学方法旋转一个有序数字数组
Mathematically rotate an array of ordered numbers
假设您在给定域中有一组数字,例如:[-4,4]
还假设这组数字在一个数组中,并且按数字顺序,如下所示:
[-4,-3-2,-1,0,1,2,3,4]
现在假设我想为这组数字创建一个新的零点,如下所示:(我选择-2作为我的新轴,所有元素都会相应地移动)
原始:[-4,-3-2,-1,0,1,2,3,4]
归零:[-2,-10,1,2,3,4,-4,-3]
对于新的归零数组,假设我有一个名为:的函数
"int getElementRelativeToZeroPosition(int zeroPos,int valueFromOriginalArray,int startDomain,int endDomain){…}">
示例用法:
我得到了原始数组的3,我想看看它在归零数组上映射到哪里,0在-2上。
getElementRelativeToZeroPosition(-2,3,-4,4)=-4
如果不必创建任何数组并为该映射移动元素,我将如何在数学上生成上述函数的所需结果?
我会这样做:
- 获取原始零位置的索引
- 获取新零位置的索引(即,在您的示例中为-2的索引)
- 获取搜索位置的索引(索引为3)
- 计算新零位置和原始零位置之间的移动矢量
- 将移动矢量应用于搜索位置以阵列大小为模执行旋转
如果您的阵列是基于零的:
index(0) => 4
index(-2) => 2
index(3) => 7
array_size => 9
move_vector => index(0) - index(-2)
=> 4 - 2 => +2
new_pos(3) => (index(3) + move_vector) modulo array_size
=> (7 + 2) mod 9 => 0
value_at(0) => -4
就是
从数学上讲,如果你有一个由包含范围[start, stop]
给定的隐式整数集,那么选择一个新的零点实际上就是选择一个索引开始。计算这个索引后,你可以计算查询点的索引(在原始域中),并找到它们之间的差来获得偏移量:
例如:
- 给定:范围[-4,4],假设与该范围中的值对应的零索引数组(0,…,8)
- 长度(范围)=
4 - (-4) + 1= 9
- 长度(范围)=
- 选择-2的新"零点"。
- -2的索引为
-2 - (-4) = -2 + 4 = 2
- -2的索引为
- 查询3的位置:
- 原始范围内的索引:
3 - (-4) = 3 + 4 = 7
- 原始范围内的索引:
- 在零数组中查找偏移量3:
- 这是原始数组中索引之间的差异
7 - 2 = 5
,因此元素3与元素-2相距五跳。等效地,它是5-len(range) = 5 - 9 = -4
跳跃。你可以坐min(abs(5), abs(-4))
看看你喜欢坐哪一辆
您可以编写一个双链表,其中有一个指向起始的头节点
struct nodeItem
{
nodeItem* pev = nullptr;
nodeItem* next = nullptr;
int value = 0;
}
class Node
{
private:
nodeItem* head;
public:
void SetHeadToValue(int value);
...
}
最后一个值应该指向第一个值的下一个,这样您就有了一个循环列表。
要计算出来,如果你在列表的末尾,你必须检查项目是否等于头节点
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '