[英]What Data Structure is Being Used in this Algorithm?
以下代碼中使用了哪種ADT,您將如何得出結論? 我有一種預感,覺得這是一個循環鏈表,但沒有一個確切的理由, 為什么 。
public class Josephus {
private final int M = 3;
private class Soldier {
int num;
Soldier next;
Soldier(int n) {
num = n;
}
}
public void survivor(int N) {
System.out.println("Number of soldiers = " + N);
if (N <= 0)
return;
Soldier first = new Soldier(0);
Soldier curr = first;
for (int i =1; n<N; i++) {
curr.next = new Soldier(i);
curr = curr.next;
}
curr.next = first;
Soldier prev = curr;
int d = 0;
int m = 0;
while (curr != prev) {
if(++m >= M){
d++;
System.out.println("Dead soldier = " + curr.num);
if (curr.num == 0) {
System.out.println("You died as number = " + d);
}
prev.next = curr.next;
m = 0;
} else
prev = curr;
curr = curr.next;
}
System.out.println("Final survivor is = " + curr.num);
}
}
我不是數據結構專家,但我相信您的循環鏈表直覺是正確的。 首先,我注意到代碼的以下部分代表數據結構的典型“節點”:
private class Soldier {
int num;
Soldier next;
Soldier(int n) {
num = n;
}
}
在這里我們可以看到Soldier next;
是對下一個節點的引用。 通常,當您看到由其自身的對象組成的類時,便會死掉。 現在,沒有“上一個”字段或“左/右子級”字段。 這表明我們沒有在處理二進制樹,雙向鏈表或任何類似性質的東西。 留下單鏈表或循環鏈表。
這是鏈接列表的構建位置:
Soldier first = new Soldier(0);
Soldier curr = first;
for (int i =1; n<N; i++) {
curr.next = new Soldier(i);
curr = curr.next;
}
我們可以看到,for循環的每次迭代都會創建一個new Soldier
對象,然后將節點的引用(從先前的迭代中)分配給該新的Soldier:
curr.next = new Soldier(i);
接下來,我們將新構造的Soldier
對象分配給curr
,以便在我們的下一個迭代中,可以使其指向列表中的下一個節點:
curr = curr.next;
在循環的結尾,我們最終指向最后一個指向null的節點。 如果不解決這個問題,那么我們將有一個單鏈表。 但是,事實並非如此,正如我們在緊隨其后的行中看到的那樣:
curr.next = first;
這是分配給列表中第一個節點的最后添加的節點的參考(此處已初始化: Soldier first = new Soldier(0);
),從而使列表循環。
其余代碼似乎只是遍歷列表,對數據結構本身沒有影響。 抱歉,如果我說了一些非常明顯的話,我只是想變得更徹底:)
這是數據結構,是循環鏈表
這里的問題可以很好地說明所使用的數據結構。 約瑟夫斯問題基本上是一種游戲,在這種游戲中,士兵們圍成一圈站着,消滅了第k個人,直到只剩下一名士兵。 現在,在這里我們需要模擬一個圍成一圈的士兵名單,因此可以適當地假設所使用的數據結構是圓形鏈接列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.