Tôi đã thực hiện tìm kiếm cơ bản cho một dự án nghiên cứu. Tôi đang cố gắng tìm kiếm hiệu quả hơn bằng cách tạo một suffix tree. Tôi quan tâm đến việc triển khai C# của thuật toán Ukkonen. Tôi không muốn lãng phí thời gian của riêng mình nếu thực hiện như vậy tồn tại.Tìm kiếm việc thực thi cây hậu tố trong C#?
Trả lời
Hei, vừa thực hiện xong thư viện .NET (C#) chứa các triển khai trie khác nhau. Trong đó:
- Cổ điển Trie
- Patricia Trie
- cây hậu tố
- Một Trie sử dụng thuật toánUkkonen của
Tôi cố gắng để làm cho mã nguồn dễ dàng đọc được. Cách sử dụng cũng rất thẳng về phía trước:
using Gma.DataStructures.StringSearch;
...
var trie = new UkkonenTrie<int>(3);
//var trie = new SuffixTrie<int>(3);
trie.Add("hello", 1);
trie.Add("world", 2);
trie.Add("hell", 3);
var result = trie.Retrieve("hel");
Thư viện được kiểm tra và xuất bản là TrieNet Gói NuGet.
Câu hỏi khó. Đây là gần nhất để phù hợp với tôi có thể tìm thấy: http://www.codeproject.com/KB/recipes/ahocorasick.aspx, mà là một thực hiện thuật toán kết hợp chuỗi Aho-Corasick. Bây giờ, các thuật toán sử dụng một cấu trúc suffix-cây giống như mỗi: http://en.wikipedia.org/wiki/Aho-Corasick_algorithm
Bây giờ, nếu bạn muốn có một cây tiền tố, bài viết này khẳng định có một thực hiện cho bạn: http://www.codeproject.com/KB/recipes/prefixtree.aspx
< hài hước> Bây giờ Tôi đã làm bài tập về nhà của bạn, làm thế nào về bạn cắt cỏ của tôi. (Tham khảo: http://flyingmoose.org/tolksarc/homework.htm) < /hài hước>
Sửa: Tôi tìm thấy một C# cây hậu tố thực hiện đó là một cổng của một C++ một đăng trên một blog: http://code.google.com/p/csharsuffixtree/source/browse/#svn/trunk/suffixtree
Sửa: Có một dự án mới tại Codeplex tập trung vào cây hậu tố: http://suffixtree.codeplex.com/
Dưới đây là việc triển khai cây hậu tố có hiệu quả hợp lý. Tôi đã không nghiên cứu thực hiện của Ukkonen, nhưng thời gian chạy của thuật toán này tôi tin là khá hợp lý, khoảng O(N Log N)
. Lưu ý số lượng các nút bên trong trong cây được tạo bằng số chữ cái trong chuỗi gốc.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using NUnit.Framework;
namespace FunStuff
{
public class SuffixTree
{
public class Node
{
public int Index = -1;
public Dictionary<char, Node> Children = new Dictionary<char, Node>();
}
public Node Root = new Node();
public String Text;
public void InsertSuffix(string s, int from)
{
var cur = Root;
for (int i = from; i < s.Length; ++i)
{
var c = s[i];
if (!cur.Children.ContainsKey(c))
{
var n = new Node() {Index = from};
cur.Children.Add(c, n);
// Very slow assertion.
Debug.Assert(Find(s.Substring(from)).Any());
return;
}
cur = cur.Children[c];
}
Debug.Assert(false, "It should never be possible to arrive at this case");
throw new Exception("Suffix tree corruption");
}
private static IEnumerable<Node> VisitTree(Node n)
{
foreach (var n1 in n.Children.Values)
foreach (var n2 in VisitTree(n1))
yield return n2;
yield return n;
}
public IEnumerable<int> Find(string s)
{
var n = FindNode(s);
if (n == null) yield break;
foreach (var n2 in VisitTree(n))
yield return n2.Index;
}
private Node FindNode(string s)
{
var cur = Root;
for (int i = 0; i < s.Length; ++i)
{
var c = s[i];
if (!cur.Children.ContainsKey(c))
{
// We are at a leaf-node.
// What we do here is check to see if the rest of the string is at this location.
for (var j=i; j < s.Length; ++j)
if (Text[cur.Index + j] != s[j])
return null;
return cur;
}
cur = cur.Children[c];
}
return cur;
}
public SuffixTree(string s)
{
Text = s;
for (var i = s.Length - 1; i >= 0; --i)
InsertSuffix(s, i);
Debug.Assert(VisitTree(Root).Count() - 1 == s.Length);
}
}
[TestFixture]
public class TestSuffixTree
{
[Test]
public void TestBasics()
{
var s = "banana";
var t = new SuffixTree(s);
var results = t.Find("an").ToArray();
Assert.AreEqual(2, results.Length);
Assert.AreEqual(1, results[0]);
Assert.AreEqual(3, results[1]);
}
}
}
- @ cdiggins, xin lỗi vì sự thiếu hiểu biết của tôi. Đây là lần đầu tiên tôi nhìn thấy một lớp trong lớp khác. Trong mã của bạn, 'public class Node' nằm trong' public class SuffixTree', kỹ năng này là gì? –
- 1. thực hiện cây hậu tố trong python
- 2. Mảng hậu tố và cây hậu tố
- 3. Làm việc với các cây hậu tố ở trăn
- 4. Cách thức và thời điểm tạo liên kết hậu tố trong cây hậu tố?
- 5. C# - Numeric hậu tố
- 6. Tìm kiếm nhị phân Cây C thực hiện
- 7. Tạo cây hậu tố của chuỗi S [2..m] từ cây hậu tố của chuỗi S [1..m]
- 8. kết thúc bằng (hậu tố) và chứa tìm kiếm chuỗi bằng MATCH trong SQLite FTS
- 9. Ngắn, Java thực hiện một cây hậu tố và cách sử dụng?
- 10. Capybara, việc tìm kiếm trong một yếu tố css
- 11. Hiểu thuật toán của Ukkonen cho hậu tố cây
- 12. B + Thực thi trên cây trên đĩa trong Java
- 13. python: thư viện cho cây hậu tố tổng quát
- 14. việc tìm kiếm các trung bình của 5 yếu tố
- 15. Tiền tố và ký tự đại diện hậu tố trong tìm kiếm văn bản đầy đủ mysql
- 16. Cây tìm kiếm nhị phân đệ quy
- 17. Thực hiện tìm kiếm Prolog
- 18. Cây tìm kiếm nhị phân trên cây AVL
- 19. Thuật toán tìm kiếm chuỗi
- 20. Tìm C++ thực hiện thuật toán cây khoảng thời gian
- 21. triển khai công cụ tìm kiếm cơ bản với cây tiền tố
- 22. tìm kiếm xpath trên cây con
- 23. Trạng thái của nghệ thuật trong việc tìm kiếm cây cờ vua máy tính là gì?
- 24. tìm kiếm trong nhật thực
- 25. Số hậu tố cho ngắn
- 26. Tìm hiểu về cấu trúc cây tìm kiếm nhị phân
- 27. Cân bằng cây tìm kiếm thứ ba
- 28. Xóa các tiền tố và hậu tố khỏi các từ trong C#
- 29. đại diện cho cây tìm kiếm nhị phân trong python
- 30. Cây tìm kiếm nhị phân tích hợp trong Python?
Bạn có thể giải thích chi tiết câu hỏi của mình không? –
Tôi đang cố gắng thực hiện tìm kiếm trong một dự án nghiên cứu. Tôi đã triển khai chỉ số đảo ngược và số lượng gia tăng của chỉ mục. Tiếp theo, tôi đã tìm kiếm để làm cho việc tìm kiếm hiệu quả hơn nhưng không muốn cuộn triển khai ST của riêng tôi nếu có. – Goran