簡體   English   中英

此算法使用什么數據結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM