Trong trường hợp mọi người tìm thấy câu hỏi này và cần một thứ gì đó được triển khai cho Node.js hoặc trình duyệt, tôi cung cấp một liên kết và ví dụ mã cho một triển khai mà tôi đã viết mà bạn có thể tìm thấy trên github tại đây: ( https://github.com /hoonto/jqgram.git ) dựa trên mã PyGram Python hiện có ( https://github.com/Sycondaman/PyGram ).
Đây là thuật toán xấp xỉ khoảng cách chỉnh sửa cây , nhưng nó nhanh hơn rất nhiều so với việc cố gắng tìm khoảng cách chỉnh sửa thực sự. Phép tính gần đúng thực hiện trong thời gian O (n log n) và không gian O (n) trong khi khoảng cách hiệu chỉnh thực thường là O (n ^ 3) hoặc O (n ^ 2) bằng cách sử dụng các thuật toán đã biết cho khoảng cách hiệu chỉnh đúng. Xem tài liệu học thuật sử dụng thuật toán PQ-Gram: ( http://www.vldb2005.org/program/paper/wed/p301-augsten.pdf )
Vì vậy, sử dụng jqgram:
Thí dụ:
var jq = require("jqgram").jqgram;
var root1 = {
"thelabel": "a",
"thekids": [
{ "thelabel": "b",
"thekids": [
{ "thelabel": "c" },
{ "thelabel": "d" }
]},
{ "thelabel": "e" },
{ "thelabel": "f" }
]
}
var root2 = {
"name": "a",
"kiddos": [
{ "name": "b",
"kiddos": [
{ "name": "c" },
{ "name": "d" },
{ "name": "y" }
]},
{ "name": "e" },
{ "name": "x" }
]
}
jq.distance({
root: root1,
lfn: function(node){ return node.thelabel; },
cfn: function(node){ return node.thekids; }
},{
root: root2,
lfn: function(node){ return node.name; },
cfn: function(node){ return node.kiddos; }
},{ p:2, q:3 },
function(result) {
console.log(result.distance);
});
Và điều đó mang lại cho bạn một số từ 0 đến 1. Càng gần 0, hai cây càng có liên quan chặt chẽ với jqgram. Một cách tiếp cận có thể là sử dụng jqgram để thu hẹp một số cây có liên quan chặt chẽ trong số nhiều cây với tốc độ của nó, sau đó sử dụng khoảng cách chỉnh sửa thực trên một vài cây còn lại mà bạn cần kiểm tra kỹ hơn và bạn có thể tìm thấy python triển khai để tham chiếu hoặc cổng của thuật toán Zhang & Shasha chẳng hạn.
Lưu ý rằng các tham số lfn và cfn chỉ định cách mỗi cây xác định tên nhãn nút và mảng con cho từng gốc cây một cách độc lập để bạn có thể làm những việc thú vị như so sánh một đối tượng với DOM của trình duyệt chẳng hạn. Tất cả những gì bạn cần làm là cung cấp các hàm đó cùng với mỗi gốc và jqgram sẽ thực hiện phần còn lại, gọi các hàm được cung cấp lfn và cfn của bạn để xây dựng cây. Vì vậy, theo quan điểm của tôi, nó (theo ý kiến của tôi dù sao) dễ sử dụng hơn nhiều so với PyGram. Thêm vào đó, Javascript của nó, vì vậy hãy sử dụng nó ở phía máy khách hoặc phía máy chủ!
CŨNG, để trả lời liên quan đến phát hiện chu kỳ, hãy kiểm tra phương pháp sao chép bên trong jqgram, có phát hiện chu kỳ ở đó, nhưng tín dụng cho điều đó thuộc về tác giả của bản sao nút mà từ đó phần đó đã được sửa đổi một chút và đưa vào.
MOVE(A,B)
dường như vẫn giống nhưINSERT(A,B)
thểA
không có bất kỳ đứa con nào. Điều gì xảy ra với con cái củaA
nếu một trong số đóINSERT(A,B)
? (liệu họ có gắn bó vớiA
cha mẹ của mình không?)