Cấu trúc dữ liệu để tìm kiếm hiệu quả, khi chèn và xóa chỉ là một phía


8

Tôi cần một cấu trúc dữ liệu để lưu trữ một số  n phần tử, mỗi phần tử được liên kết với một số thời gian khác nhau  .  khác nhau và trong khi nó có giới hạn trên lý thuyết, đây là nhiều bậc có độ lớn lớn hơn mức thường được sử dụng.tTôin

Thông qua ứng dụng của tôi, tôi có thể đảm bảo rằng:

  • Các phần tử được chèn luôn mới hơn tất cả các phần tử hiện có, nghĩa là, nếu một phần tử được liên kết với thời gian được chèn, thì . Các yếu tố được chèn từng cái một.tˇtˇ>tTôiTôi1,Giáo dục,n

  • Chỉ các phần tử cũ nhất bị xóa, nghĩa là, nếu phần tử bị xóa, thì . Việc xóa hầu hết xảy ra từng cái một, nhưng không có tác hại trực tiếp nếu việc loại bỏ phần tử bị trì hoãn, miễn là phần nhỏ của các phần tử được lưu trữ giả vẫn nhỏ hơn 1.jtj<tTôi Tôi{1,Giáo dục,n}{j}

  • Ngoài việc chèn và xóa, điều duy nhất tôi cần làm là tìm hai phần tử lân cận trong một khoảng thời gian nhất định với . Với các từ khác, tôi cần tìm hai phần tử  và  sao cho và ∄ l ∈ \ {1, Nott, n \}: t_j <t_l <t_k .t~tối thiểuTôitTôi<t~<tối đaTôitTôijktj<t~<tktôi{1,Giáo dục,n}:tj<ttôi<tk

Tiêu chí của tôi cho cấu trúc dữ liệu là:

  1. Tìm các yếu tố như mô tả ở trên nên càng nhanh càng tốt.
  2. Chèn và loại bỏ nên được nhanh chóng.
  3. Cấu trúc dữ liệu tương đối đơn giản để thực hiện.

Miễn là chúng ta không nói về một bù thời gian chạy nhỏ, mỗi tiêu chí được ưu tiên hơn tiếp theo.

Nghiên cứu của tôi cho đến nay đã cho thấy câu trả lời có khả năng là một loại cây tìm kiếm tự cân bằng, nhưng tôi đã không tìm thấy bất kỳ thông tin nào trong số đó là tốt nhất cho trường hợp chèn hoặc xóa một phía, và nó có thể sẽ khiến tôi phải trả giá thời gian đáng kể để tìm hiểu bản thân mình. Ngoài ra, tôi chỉ tìm thấy thông tin không đầy đủ về việc cây tự tổ chức tốt như thế nào và nhanh như thế nào (ví dụ, cây AVL tự tổ chức cứng hơn cây đỏ đen), chứ đừng nói đến việc điều này bị ảnh hưởng bởi việc chèn hoặc xóa một phía.


4
Đây chỉ là thực hiện tìm kiếm nhị phân giống như mảng trong một hàng đợi.
o11c

Câu trả lời:


5

Lưu trữ các phần tử dưới dạng một chuỗi, được sắp xếp bằng cách tăng dấu thời gian. Sử dụng tìm kiếm nhị phân để tìm vị trí nơi sẽ xảy ra nếu nó nằm trong mảng; sau đó bạn có thể dễ dàng tìm thấy hai yếu tố lân cận. Tìm hai phần tử lân cận có thể được thực hiện trong thời gian .t~Ôi(lgn)

Bạn cũng cần có khả năng nối vào cuối chuỗi và xóa từ đầu. Như vậy, về cơ bản bạn cần một hàng đợi.

Có các công trình tiêu chuẩn cho một hàng đợi. Chẳng hạn, bạn có thể lưu trữ chúng trong một mảng, với các thao tác chèn và xóa thời gian được khấu hao . Về cơ bản, bạn có một mảng cho các phần tử của chuỗi và chỉ mục bắt đầu (cho phần đầu của chuỗi) và chỉ mục kết thúc (cho phần cuối của chuỗi). Để xóa từ đầu, tăng chỉ số bắt đầu. Để thêm vào cuối, tăng chỉ số kết thúc; nếu điều này chạy qua phần cuối của mảng hiện có, hãy phân bổ một mảng mới có kích thước gấp đôi và sao chép vào mảng mới.Ôi(1)

Ngoài ra: bạn có thể lưu trữ các phần tử trong cây nhị phân cân bằng. Điều này sẽ đạt được trường hợp xấu nhất cho tất cả các hoạt động.Ôi(lgn)

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.