在数组中创建位置层次结构
Make position hierarchy in array
我有以下任务。我们得到一个N大小的数字和一个用整数填充的数组,以此来实现该算法。现在,我们数组中的每个数字基本上都是数组中的一个位置。每个阵列都有一个首领。它的值与其在数组中的位置相同。一个示例阵列是:
1 2 4 5 4 1
在这个数组中,引线的值为4,因为它位于第4个位置。在我们获得的数据中,必须始终有一位领导者。现在我们建立一个层次结构。领导者得到的值是0,那些指向他的值,所以在这种情况下有4的值,得到新的值1,依此类推
3 2 1 4 0 3
Leader是0,在位置2,我们也有一个4,所以它成为层次结构中下一个编号为1的。在位置1,我们有一个2,所以它指向第二个位置-层次结构中的新1,所以它成为层次结构中第二个,依此类推。原始数组中每隔2个也会变成2。
输入数据将以txt文件的形式提供。现在我需要最好的算法来完成这项工作。我用递归做了一个。这里我也想问一下复杂性是什么,是N*logN吗?输入来自一个文件,N也是。示例输入file.txt是4
1 2 3 3
6
1 2 4 5 4 1
以上(稍后)的输出:3 2 1 0
3 2 1 4 0 3
这是我的代码(输入目前已修复):
#include <iostream>
using namespace std;
int *T;
int nr(int x)
{
if (T[x] == x)
return 0;
else
return nr(T[x]) + 1;
}
int main()
{
int n, m, leader;
n = 6;
T = new int[n];
int T1[6];
T[0] = 1;
T[1] = 2;
T[2] = 4;
T[3] = 5;
T[4] = 4;
T[5] = 1;
for (int i = 0; i < n; ++i)
{
T1[i] = nr(i);
}
for (int i = 0; i < n; ++i)
{
cout<<T1[i]<<" ";
}
cout << endl;
delete[] T;
}
对于每个位置,我们想知道哪些单元格指向它。
1 2 4 5 4 1
5: 3
4: 2, 4 (leader)
3: None
2: 1
1: 0, 5
0: None
现在从领先者开始回溯:
Who's looking at 4?
-> 2
[x, x, 1, x, 0, x]
Who's looking at 2?
-> 1
[x, 2, 1, x, 0, x]
Who's looking at 1?
-> 0 and 5
[3, 2, 1, x, 0, 3]
Who's looking at 0 or 5?
-> 3
[3, 2, 1, 4, 0, 3]
伪码:
// For each position, we'd like to know
// which cells are pointing to it
A = input array
leader = None
map = {}
for i=0 to length(A)-1:
if i = A[i]:
leader = i
if i != leader:
if A[i] in map:
map[A[i]].append(i)
else:
map[A[i]] = [i]
//Now follow backwards from the leader
output = Array(length(A))
next = leader
output[leader] = 0
rank = 0
// Assumes the data provides
// for a straightforward solution.
// There may be edge cases to work
// out if that's not the case.
while next:
for i in map[next]:
next = None
if i in map:
next = i
rank = rank + 1
for j in map[next]:
output[j] = rank
break
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 是否可以使一个类成为两个不同层次结构的子类?
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 在数组中创建位置层次结构