我想创建一个类似于双链表(但有数组)的东西,它与下限/上限一起使用。
典型的圆形阵列可能如下所示:
next = (current + 1) % count;
previous = (current - 1) % count;
但是,将下限/上限正确地纳入其中的数学运算是什么?
那样:
- >项目1的索引2上的下一个返回0
- >项目1的索引0上的前一个返回2
- >项目2的索引4上的下一个返回3
- >项目2的索引3上的前一个返回4
谢谢!
注意:无法使用外部库。
答案 0 :(得分:6)
一般数学术语:
next === current + 1 (mod count)
prev === current - 1 (mod count)
其中===是'congruent'运算符。将其转换为模数运算符,它将是:
count = upper - lower
next = ((current + 1 - (lower%count) + count) % count) + lower
prev = ((current - 1 - (lower%count) + count) % count) + lower
你应该找出上面的&每个项目的下限。您可以将其存储在二叉树中以便快速检索。也许我不理解你的问题。
(请注意,这假设较低的< upper,且较低的> 0)
答案 1 :(得分:5)
+=======+ +=======+ +=======+
| Obj | ---> | Obj | ---> | Obj |
buffer | 1 | <--- | 2 | <--- | 3 |
+=======+ +=======+ +=======+
index 0 1 2 /* our first run */
index 3 4 5 /* second run */
and so on ...
因此,您看到3个成员列表,第1个项目由0, 3, 6,
等索引。同样,第2个项目由1, 4 (1 + 3), 7 (4 + 3), ...
索引
一般规则是:next <- (next + 1) % size
,其中size = upper - lower + 1
使用这个公式我们得到:
curr | next
-------+-----------------
0 | (0 + 1) % 3 = 1
-------+-----------------
1 | (1 + 1) % 3 = 2
-------+-----------------
2 | (2 + 1) % 3 = 0
-------+-----------------
希望有所帮助
答案 2 :(得分:3)
几年前我写了一篇关于圆形STL迭代器的文章。
http://noveltheory.com/Iterators/Iterator_N0.htm
它适用于任何STL集合(矢量&amp; boost:数组等)
答案 3 :(得分:1)
Boost有一个Circular container,我相信你也可以设置界限。
事实上,该页面上的示例与您在此处所说的内容非常相似。
但无论如何,你可以使用模数轻松完成数学部分:
所以说你的最大值是3:
int MAX = 3;
someArray[ 0 % MAX ]; // This would return element 0
someArray[ 1 % MAX ]; // This would return element 1
someArray[ 3 % MAX ]; // This would return element 0
someArray[ 4 % MAX ]; // This would return element 1