Tính chiều cao của cây cơ số


8

Giới thiệu

Một cây radix , còn được gọi là Trie nén hoặc cây tiền tố nén, là một cấu trúc dữ liệu cây như để lưu trữ một tập các chuỗi. Các cạnh của cây được gắn nhãn bởi các chuỗi không trống và mỗi nút là đầu cuối hoặc nonterminal. Các chuỗi mà cây chứa chính xác là nhãn của tất cả các đường dẫn từ gốc đến nút cuối. Cây phải ở dạng bình thường được xác định bởi các điều kiện sau:

  • Tất cả các nút không gốc nonterminal có ít nhất hai con.
  • Đối với mỗi nút, tất cả các cạnh đi có ký tự đầu tiên khác nhau.

Ví dụ, đây là cây cơ số chứa tập hợp ["test", "testing", "tested", "team", "teams", "technical", "sick", "silly"], với (N)biểu diễn một nút nonterminal và (T)một nút đầu cuối:

-(N)-te-(N)-st-(T)-ing-(T)
  |      |      | 
  |      |      +-ed-(T)
  |      |
  |      +-am-(T)-s-(T)
  |      |
  |      +-chnical-(T)
  |
  +-si-(N)-ck-(T)
        |
        +-lly-(T)

Trong thử thách này, nhiệm vụ của bạn là tính chiều cao của cây, đưa ra các chuỗi làm đầu vào.

Đầu vào

Đầu vào của bạn là một danh sách không trống các chuỗi ký tự ASCII viết thường. Nó sẽ không chứa các bản sao, nhưng nó có thể theo bất kỳ thứ tự nào. Nó có thể chứa chuỗi rỗng. Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý.

Đầu ra

Đầu ra của bạn sẽ là chiều dài của đường dẫn từ gốc đến lá dài nhất trong cây cơ số tương ứng, được đo bằng số nút mà nó chứa.

Trong ví dụ trên, đầu ra đúng là 4, tương ứng với các đường dẫn

(N)-te-(N)-st-(T)-ing-(T)
(N)-te-(N)-st-(T)-ed-(T)
(N)-te-(N)-am-(T)-s-(T)

Trong đó có 4 nút.

Ví dụ khác

Dưới đây là một vài ví dụ về cây radix:

[""]
-(T)

["","fuller"]
-(T)-fuller-(T)

["","full","fuller"]
-(T)-full-(T)-er-(T)

["full","fuller"]
-(N)-full-(T)-er-(T)

["full","filler"]
-(N)-f-(N)-ull-(T)
        |
        +-iller-(T)

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Đây là mã golf, vì vậy số byte thấp nhất sẽ thắng.

Bạn có thể sử dụng bất kỳ thư viện hoặc thư viện tích hợp nào bạn muốn, nhưng hãy nhớ bao gồm tất cả importcác vv trong số byte của bạn. Thư viện của bên thứ ba - những thư viện không có trong bản cài đặt ngôn ngữ của bạn - được cho phép, nhưng phải được liệt kê riêng trong tiêu đề, ví dụ: Python + pytrie0.2, 60 byte .

Các trường hợp thử nghiệm

[""] -> 1
["fuller"] -> 2
["","fuller"] -> 2
["","full","fuller"] -> 3
["full","fuller"] -> 3
["full","filler"] -> 3
["full","filler","filter"] -> 4
["full","filler","fi","filter"] -> 5
["test","testing","tested","team","teams","technical","sick","silly"] -> 4
["a","aaaa","aabbaa","aabbaab","abaaa","aab","aabbb","aabba"] -> 8
["dbdbaca","ab","a","caaabaaa","adbbabdb","dbdbdbaca","dbbadbacaba","db"] -> 4
["db","dbbdbb","dbaa","cabcacaa","","acaabcacab","b","abaaaca","bacaaaaa"] -> 3
["aabaabdbb","bacaabadbbdb","abb","aabaa","ab","bcadbb","adbbcaaadbbb","caaa","bbdbcacadbab","dbbdbdb"] -> 4
["bbcaaabbbabbcadbbacadbbdbdb","b","bbbbaaaaaababa","ca","bb","bdbbacadbbdbbdbbababaacaca","abbaabbabcabaaa","bbbacacacabcacacabaaabb","bbcaaaab","bbbbcaacaadbcaaa","babbabcadbdbacacabbcacab","abcabbbaacadbcadb","bbcabbcadbcacaacaadbadbcaadb","dbbbdbbdbacaabbacabcadbdbacaca","bbaabdbdb","cabcadbbbadbadbbaadbcaca","adbadbadbdbcacadbdbbcaadbcaca","abaabbcab","aaabcaabcaab","bacacabcacaacadbadbb"] -> 6

Trong ví dụ đầu tiên của bạn, tôi cảm thấy như "am" nên được theo sau bởi một nút có hai con, một có - "" - (T) và nút kia có - "s" - (T). (So ​​sánh với "chậm" / "chậm" trong ví dụ thứ hai trên trang bạn đã liên kết.) Tuy nhiên, điều này sẽ không ảnh hưởng đến độ dài của đường dẫn từ gốc đến lá dài nhất.
Greg Martin

@GregMartin Trang Wikipedia có cách triển khai hơi khác. Tôi cảm thấy rằng điều này là tự nhiên hơn, và như bạn đã nói, nó không ảnh hưởng đến chiều cao.
Zgarb

Câu trả lời:


2

JavaScript (Firefox 30-57), 137 byte

f=(a,b=["",...a],s=new Set(b.map(w=>w[0])))=>b.length>1?(s.size>1)+Math.max(...(for(c of s)f(a,[for(w of b)if(w&&w[0]==c)w.slice(1)]))):1

Phải có điều gì đó sai với thuật toán của tôi vì tôi dường như phải đặc biệt tham số chuỗi rỗng.


Trong giải pháp tham chiếu của tôi, chuỗi trống cũng là một trường hợp đặc biệt. Đó là bởi vì nút gốc có quy tắc riêng của nó.
Zgarb

Tôi cũng phải xử lý trường hợp đặc biệt, nhưng trường hợp đặc biệt đó chỉ là một ký tự duy nhất trong giải pháp của tôi ( .ở cuối dòng đầu tiên).
Martin Ender

1

Võng mạc , 69 55 byte

Các linefeed trailing là đáng kể.

m`.(?<=(?=\D*^\1(?!\2))\D*^(.*)(.))|^.
:$&
T`w
O`
A-2`

Đầu vào là một danh sách được phân tách theo dòng.

Hiệu suất có thể được tăng lên đáng kể bằng cách chèn một \Atrước dòng cuối cùng \Dtrên dòng đầu tiên.

Giải trình

Một nút được chèn vào một từ ở ba vị trí:

  • Sự bắt đầu.
  • Sau bất kỳ tiền tố dài nhất được chia sẻ với một từ khác. Đó là, một tiền tố được chia sẻ sau đó hai từ khác nhau.
  • Kết thúc.

Ở Retina, nó có xu hướng ngắn hơn để sản xuất N+1khi bạn đếm số Nthứ, vì vậy chúng tôi bỏ qua cái cuối cùng. Tuy nhiên, đối với trường hợp đầu vào trống, sau đó chúng ta cũng sẽ phải bỏ qua bắt đầu, bởi vì bắt đầu và kết thúc là như nhau.

Để thực hiện đếm thực tế, chúng tôi chèn :vào mọi nơi có nút. Sau đó, chúng ta chỉ cần tìm số lượng tối đa của :một từ và trả về số đó cộng thêm 1. Đây là cách mã thực hiện:

m`.(?<=(?=\D*^\1(?!\2))\D*^(.*)(.))|^.
:$&

Điều này phát hiện tất cả các nút. Nó phù hợp với một nhân vật. Sau đó, nó đi vào một cái nhìn mà bắt nhân vật đó thành nhóm 2và tiền tố trước khi nó thành nhóm 1. Sau đó, nó đi đến đầu chuỗi để bắt đầu một cái nhìn, kiểm tra xem nó có thể tìm thấy tiền tố ở đâu đó không theo sau bởi ký tự bị bắt. Nếu chúng tôi tìm thấy trận đấu này, chúng tôi chèn một :phía trước của nhân vật. Chúng tôi cũng khớp ký tự đầu tiên của từ hiện tại để chèn một :từ đầu của các từ không trống.

T`w

Điều này loại bỏ tất cả các chữ cái và chỉ để lại :.

O`

Điều này sắp xếp các dòng, mang lại độ sâu tối đa đến cuối cùng.

A-2`

Điều này loại bỏ tất cả trừ dòng cuối cùng.

Và dòng trống ở cuối sẽ đếm số lượng kết quả trống trong dòng đó, nhiều hơn số lượng dấu hai chấm trong đó.

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp dữ liệu, trong đó mỗi trường hợp kiểm tra sử dụng phân tách bằng dấu phẩy thay thế.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.