Tôi tin rằng bạn có thể thực hiện truy cập trong thời gian O (log (N)), cho thời gian tiền xử lý O (N log (N)) và không gian thêm O (N log (N)). Đây là cách làm.
Bạn có thể tăng thêm một cây đỏ đen để hỗ trợ hoạt động select(i)
truy xuất phần tử ở cấp bậc i
trong thời gian O (log (N)). Ví dụ: see this PDF hoặc chương thích hợp của Giới thiệu về thuật toán.
Bạn có thể thực hiện một cây đỏ đen (thậm chí được tăng thêm để hỗ trợ select(i)
) theo cách chức năng, sao cho hoạt động chèn trả về một cây mới chia sẻ tất cả trừ nút O (log (N)) với cây cũ . Xem ví dụ Purely Functional Data Structures bởi Chris Okasaki.
Chúng tôi sẽ xây dựng một mảng T
cây đỏ-đen tăng cường hoàn toàn chức năng, như vậy mà cây T[j]
lưu trữ các chỉ số 0 ... j-1
của j
yếu tố đầu tiên của A
sắp xếp lớn nhất đến nhỏ.
Trường hợp cơ sở: Tại T[0]
tạo cây tăng màu đỏ đen chỉ với một nút, có dữ liệu là số 0, là chỉ mục của phần tử lớn thứ 0 trong 1 phần tử đầu tiên của mảng A
.
bước Inductive: Đối với mỗi j
từ 1 tới N-1
, tại T[j]
tạo ra một cây đỏ-đen tăng cường bằng cách hoàn toàn chức năng chèn một nút mới với chỉ số j
vào cây T[j-1]
. Điều này tạo ra tối đa các nút mới O (log (j)); các nút còn lại được chia sẻ với T[j-1]
. Điều này có thời gian O (log (j)).
Tổng thời gian để tạo mảng T
là O (N log (N)) và tổng không gian được sử dụng cũng là O (N log (N)).
Khi T[j-1]
được tạo ra, bạn có thể truy cập vào các yếu tố i
lớn thứ của j
yếu tố đầu tiên của A
bằng cách thực hiện T[j-1].select(i)
. Điều này có thời gian O (log (j)). Lưu ý rằng bạn có thể tạo T[j-1]
một cách lười biếng trong lần đầu tiên cần. Nếu A
là rất lớn và j
luôn luôn là tương đối nhỏ, điều này sẽ tiết kiệm rất nhiều thời gian và không gian.
Nguồn
2013-03-12 05:52:06
có thể cung cấp đầu vào và đầu ra mẫu? – stinepike
Đây là một câu hỏi thực sự thú vị, tôi đang nghĩ về nó :) – Patashu