Sự phức tạp của hàm phân tách chuỗi của Java là gì?


8

Chuỗi của tôi là loại "abacsdsdvvsg"hoặc "a a a a a a a"
Và tôi sử dụng String[] stringArray = s.split("");hoặc String[] stringArray = s.split(" ");
tôi đang tự hỏi điều gì sẽ là sự phức tạp (trong O(string length)) cho việc phân tách ở trên?
PS: Tôi biết cách tính O (...) nếu mã được đưa ra. Ở đây tôi không biết thuật toán của hàm split.



Vì tôi không biết algo của chức năng phân chia, tôi không nghĩ đó là một câu hỏi trùng lặp @gnat
tezz

Câu trả lời:


7

Độ phức tạp sẽ phụ thuộc vào biểu thức chính mà bạn sử dụng để thực hiện phân tách. (Có, đối số bạn cung cấp cho String.split (...) là một biểu thức chính quy!)

Ví dụ của bạn, nó sẽ là O(N)nơi Nlà số ký tự trong chuỗi đầu vào.

Thuật toán phân tách khá đơn giản, dựa trên việc triển khai regex hiện có. Một mô tả cấp cao là:

  1. Biên dịch regex và tạo một trình so khớp
  2. Lặp lại qua chuỗi:
    1. Sử dụng Matcher.find(...)để tìm ranh giới từ tiếp theo
    2. Sử dụng String.sub chuỗi để trích xuất từ
    3. Thêm từ vào danh sách các chuỗi
  3. Chuyển đổi danh sách các chuỗi thành một chuỗi các chuỗi.

Việc tìm kiếm các khoảng nghỉ giữa các "từ" sẽ O(N)phức tạp hơn, tùy thuộc vào biểu thức chính quy ( findcuộc gọi). Việc xây dựng danh sách, mảng kết quả và chuỗi con sẽ O(N)trong trường hợp xấu nhất.

Các chi tiết chính xác có trong mã nguồn mà bạn có thể tìm thấy bằng Google. (Tìm kiếm "java.lang.String" source, chọn một và sau đó đi sâu vào phiên bản Java mà bạn quan tâm. Hoặc tìm kiếm các tệp trong tệp ZIP mã nguồn có trong cài đặt JDK của bạn)


3

Đó là O (n) trong các trường hợp cụ thể của bạn, trong đó bạn đang phân tách bằng dấu tách độ dài 1/0 ký tự. Nói chung, đó là O (n + k) với dấu tách k ký tự, có thể được thực hiện bằng thuật toán KMP. Phân chia chuỗi Java cũng chấp nhận regexes như các bộ tách biệt, trong trường hợp độ phức tạp của nó phụ thuộc vào thuật toán phù hợp được sử dụng. Một thuật toán khớp regex phổ biến là thuật toán NFA của Thompson.

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.