以数学方式旋转有序数字的数组

时间:2016-06-07 14:37:00

标签: c++ arrays performance mapping

假设您在给定域中有数字,例如:[ - 4,4]

还假设这组数字在数组中,并且在数字顺序中,如下所示:

  

[ - 4,-3 -2,-1,0,1,2,3,4]

现在假设我想为这组数字创建一个新的零点,如下所示:(我选择 -2 作为我的新轴,并且所有元素都相应地移动了)

  

原文:[ - 4,-3 -2 ,-1,0,1,2,3,4]

     

归零:[ - 2,-1 0 ,1,2,3,4,-4,-3]

使用新的归零数组,假设我有一个名为:

的函数
  

“int getElementRelativeToZeroPosition(int zeroPos,int valueFromOriginalArray,int startDomain,int endDomain){...}”

示例用法:

  

我得到3个原始数组,并希望看到它在归零数组上的映射位置,其中零点为-2。

     

getElementRelativeToZeroPosition(-2,3,-4,4)= -4

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

3 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 获取原始零位的索引
  2. 获取新零位置的索引(即示例中-2的索引)
  3. 获取搜索位置的索引(索引为3)
  4. 计算新原始零位置之间的移动向量
  5. 将移动矢量应用于搜索位置模数数组大小以执行旋转
  6. 如果您的数组从零开始:

    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
    

    就是这样

答案 1 :(得分:1)

从数学角度讲,如果你有一个由包含范围[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))查看您更喜欢哪一个。

答案 2 :(得分:0)

你可以编写一个双重链表,头节点指向开头

struct nodeItem
{
    nodeItem* pev = nullptr;
    nodeItem* next = nullptr;
    int value = 0;
}

class Node
{
private:
    nodeItem* head;

public:
    void SetHeadToValue(int value);
    ...
}

最后一个值应指向第一个值旁边,因此您有一个循环列表。

要想知道,如果你在列表的末尾,你必须检查项目是否等于头节点