Ngoài ra còn có thuật toán không gian tuyến tính và không gian tuyến tính dựa trên phân vùng, có thể linh hoạt hơn nếu bạn đang cố gắng áp dụng điều này cho các biến thể của vấn đề mà phương pháp toán học không hoạt động tốt. Điều này đòi hỏi phải thay đổi mảng cơ bản và có các yếu tố không đổi tồi tệ hơn so với phương pháp toán học. Cụ thể hơn, tôi tin rằng chi phí tính theo tổng số giá trị và số lượng trùng lặp là và , mặc dù việc chứng minh nó sẽ nghiêm ngặt mất nhiều thời gian hơn tôi có tại thời điểm này.d O ( n log d ) O ( d )ndO(nlogd)O(d)
Thuật toán
Bắt đầu với một danh sách các cặp, trong đó cặp đầu tiên là phạm vi trên toàn bộ mảng hoặc nếu 1 chỉ mục.[(1,n)]
Lặp lại các bước sau cho đến khi danh sách trống:
- Lấy và xóa bất kỳ cặp khỏi danh sách.(i,j)
- Tìm mức tối thiểu và tối đa, và , của phân đoạn được ký hiệu.maxminmax
- Nếu , phân đoạn con chỉ bao gồm các phần tử bằng nhau. Mang lại các yếu tố của nó ngoại trừ một và bỏ qua các bước 4 đến 6.min=max
- Nếu , phân đoạn con không chứa các bản sao. Bỏ qua bước 5 và 6.max−min=j−i
- Phân vùng phân đoạn xung quanh , sao cho các phần tử lên đến một số chỉ mục nhỏ hơn dấu phân cách và các phần tử bên trên chỉ mục đó thì không. kmin+max2k
- Thêm và vào danh sách.( k + 1 , j )(i,k)(k+1,j)
Phân tích chữ thảo về độ phức tạp thời gian.
Các bước từ 1 đến 6 mất thời gian , vì việc tìm tối thiểu và tối đa và phân vùng có thể được thực hiện trong thời gian tuyến tính.O(j−i)
Mỗi cặp trong danh sách là cặp đầu tiên, hoặc là con của một số cặp mà phân đoạn tương ứng chứa một phần tử trùng lặp. Có nhiều nhất là như vậy, vì mỗi lần truyền qua một nửa phạm vi có thể trùng lặp, do đó, có tối đa khi bao gồm các cặp không có bản sao. Tại bất kỳ thời điểm nào, kích thước của danh sách không quá .( 1 , n ) d ⌈ log 2 n + 1 ⌉ 2 d ⌈ log 2 n + 1 ⌉ 2 d(i,j)(1,n)d⌈log2n+1⌉2d⌈log2n+1⌉2d
Hãy xem xét công việc để tìm bất kỳ một bản sao. Điều này bao gồm một chuỗi các cặp trong phạm vi giảm theo cấp số nhân, do đó, tổng công việc là tổng của chuỗi hình học, hoặc . Điều này tạo ra một hệ quả rõ ràng rằng tổng công việc cho các bản sao phải là , là tuyến tính tính theo .d O ( n d ) nO(n)dO(nd)n
Để tìm một ràng buộc chặt chẽ hơn, hãy xem xét trường hợp xấu nhất của các bản sao trải rộng tối đa. Theo trực giác, tìm kiếm có hai giai đoạn, một giai đoạn trong đó toàn bộ mảng được duyệt qua mỗi lần, trong các phần nhỏ dần và một trong đó các phần nhỏ hơn nên chỉ các phần của mảng được dịch chuyển. Giai đoạn đầu tiên chỉ có thể là sâu, vì vậy có chi phí và giai đoạn thứ hai có chi phí vì tổng diện tích được tìm kiếm lại giảm theo cấp số nhân . logdO(nlogd)O(n)ndlogdO(nlogd)O(n)