这是一个有趣的问题,但更多的算法比数据结构。
我注意到,Map^i[n]
可以在固定的时间来解决......如果不是修改结构,你调整访问。
从我的问题,值简称为 “周期” 的理解:[15, 20, 12, 18]
- >- >[12, 18, 15, 20]
- >[18, 15, 20, 12]
公式:
- 令N是所述序列的大小 - 1和n
[0, N]
的序列中的索引
- 设I在
[0, N]
是迭代
Value^i[n] = Value[n+i%(N+1)]
的关键是,虽然不同:
[0.5, 1, 2.3, 3.7]
- >[0.5, 1.8, 3.2, 3.7]
- >[1.3, 2.7, 3.2, 3.7]
- >[1.4, 1.9, 2.4, 3.7]
- 让我们试着看到一个模式:
[a, b, c, d]
- >[b-a, c-a, d-a, d]
- >[c-b, d-b, d-b+a, d]
- >[d-c, d-c+a, d-c+b, d]
使图案更加明显:
0: [a , b , c , d , e , f]
1: [b-a , c-a , d-a , e-a , f-a , f]
2: [c-b , d-b , e-b , f-b , f-(a-b), f]
3: [d-c , e-c , f-c , f-(a-c), f-(b-c), f]
4: [e-d , f-d , f-(a-d), f-(b-d), f-(b-e), f]
5: [f-e , f-(a-e), f-(b-e), f-(c-e), f-(d-e), f]
请注意,这也是循环,因为再次应用转换会产生原始序列。
式(我们重新使用以前的变量):
Key^i[n] = | n = N => Key[N]
| i = 0 => Key[n]
| n <= N-i => Key[n+i] - Key[i-1]
| n > N-i => Key[N] - (Key[n+i % (N+1)] - Key[i-1])
后者3线可以在(Key[n+i % (N+1)] - Key[i-1]) % Key[N]
被聚集,如果我们定义(任意地)Key[-1] = 0
。
现在我们有了我们的公式,我们需要一个随机访问的结构,我会简单地选择一个vector
。下面提供
可编译示例(或见ideone),得到:
[ 0.5: 15, 1: 20, 2.3: 12, 3.7: 18 ]
[ 0.5: 20, 1.8: 12, 3.2: 18, 3.7: 15 ]
[ 1.3: 12, 2.7: 18, 3.2: 15, 3.7: 20 ]
[ 1.4: 18, 1.9: 15, 2.4: 20, 3.7: 12 ]
实施例:
#include <cassert>
#include <algorithm>
#include <iostream>
#include <vector>
typedef std::pair<double, double> Pair;
typedef std::vector<Pair> Vector;
double key(Vector const& vec, size_t const i, size_t const n) {
assert(n < vec.size() && "Wrong index");
if (i == 0) { return vec[n].first; }
size_t const N = vec.size() - 1;
if (n == N) { return vec.back().first; }
double const partial = vec[(n+i) % (N+1)].first - vec[(i-1) % (N+1)].first;
return (n <= N-i) ? partial : partial + vec[N].first;
} // key
double value(Vector const& vec, size_t const i, size_t const n) {
assert(n < vec.size() && "Wrong index");
return vec[(n+i) % vec.size()].second;
} // value
int main() {
Vector vec{ Pair(0.5, 15), Pair(1, 20), Pair(2.3, 12), Pair(3.7, 18) };
sort(vec.begin(), vec.end()); // just to be sure
size_t const size = vec.size();
for (size_t i = 0; i != size; ++i) {
std::cout << "[ ";
for (size_t n = 0; n != size; ++n) {
if (n != 0) { std::cout << ", "; }
std::cout << key(vec, i, n) << ": " << value(vec, i, n);
}
std::cout << " ]\n";
}
}
有没有这样的事情在图“第一元件”。你可以定义“第一” - 是最低的键值? – hamstergene
@Eugene:是的,这是最低的关键... – abcdef
元素你应该注意到,地图不排序。因此,这种“旋转”的想法是没有意义的。 –