在数组中创建位置层次结构

Make position hierarchy in array

本文关键字:位置 层次结构 创建 数组      更新时间:2023-10-16

我有以下任务。我们得到一个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