2017-08-28 7 views
2

アルゴリズムの質問。リスト1, 2, 3, 4, 5とサブリスト2, 3を持っているとしましょう。アルゴリズムは、サブリストがインデックス1から始まるため、1を返します。指定されたサブリストが存在しない場合、アルゴリズムは-1を返します。サブリストのインデックスを見つける

このようなデータ構造が定義されています(Node)。

Node.java

private static class Node { 

    public Node(int value) { 
     this.value = value; 
     this.next = null; 
    } 

    int value; 
    Node next; 
} 

私は次のアルゴリズムを作ってみたが、それはパフォーマンスの面でより優れたを取得する場合、私は興味があります。

public static int findSublistIndex(MyLinkedList list, MyLinkedList sublist) { 
    if (list.head == null || sublist.head == null) { 
     return -1; 
    } 

    int index = -1; 

    for (Node l = list.head; l != null; l = l.next) { 
     index ++; 

     // encountered a value that is equal to the first value of a sublist 
     if (l.value == sublist.head.value) { 
      Node n = l; 

      // check the rest of the sublist 
      for (Node s = sublist.head; s != null; s = s.next) { 
       if (n.value == s.value && s.next == null) { 
        return index; 
       } else if (n.value == s.value) { 
        n = n.next; 
       } else { 
        // the pointer should be set to l here to skip repeating? l = n;? -- doesn't work! 
        break; 
       } 
      } 
     } 
    } 

    return -1; 
} 

さらに、このようなリストアルゴリズムの問​​題をいくつか練習したいと思います。このような問題を抱えているウェブサイトをお勧めしますか

+4

で見つけることができる、それはプログラミングを実践する場所のための作業のアルゴリズムと勧告の見直しを要求するので、私は、オフトピックとして、この質問を閉じるために投票しています。 – dasblinkenlight

+0

@dasblinkenlightだから何が問題なの?私はアルゴリズムの可能な改善を求めています。そして、アドバイスをどこで練習するべきか尋ねない理由... – wesleyy

+0

この質問は、スタックオーバーフローのofftopicです。そのような質問を投稿するには、[コードレビューサイト](https://codereview.stackexchange.com/)を参照してください。さらに、オフサイトのリソースの推奨を求める質問は、サイトの明白な排除である。 – dasblinkenlight

答えて

3

より良いアルゴリズムはKMP algorithmです。これは、部分文字列検索を行うために使用され、あなたのケースでも使用できます。その時間コストはO(n + k)であり、線形アルゴリズムであり、アルゴリズムはO(nk)であり、nはリストの長さであり、kはサブリストの長さである。

よりアルゴリズムの挑戦やコードの挑戦、あなたがcodeForcesまたはleetcode

関連する問題