用数学方法旋转一个有序数字数组

Mathematically rotate an array of ordered numbers

本文关键字:一个 序数 数字 数组 数学方法 旋转      更新时间:2023-10-16

假设您在给定域中有一组数字,例如:[-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

如果不必创建任何数组并为该映射移动元素,我将如何在数学上生成上述函数的所需结果?

我会这样做:

  1. 获取原始零位置的索引
  2. 获取新零位置的索引(即,在您的示例中为-2的索引)
  3. 获取搜索位置的索引(索引为3)
  4. 计算新零位置和原始零位置之间的移动矢量
  5. 将移动矢量应用于搜索位置以阵列大小为模执行旋转

如果您的阵列是基于零的:

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
  • 查询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);
...
}

最后一个值应该指向第一个值的下一个,这样您就有了一个循环列表。

要计算出来,如果你在列表的末尾,你必须检查项目是否等于头节点