Cấu trúc dữ liệu nào sẽ lưu trữ hiệu quả các phạm vi số nguyên?


10

Tôi cần giữ một bộ sưu tập về các số nguyên trong phạm vi 0 đến 65535 để tôi có thể nhanh chóng thực hiện các thao tác sau:

  • Chèn một số nguyên mới
  • Chèn một loạt các số nguyên liền kề
  • Xóa một số nguyên
  • Xóa tất cả các số nguyên dưới một số nguyên
  • Kiểm tra nếu có một số nguyên

Dữ liệu của tôi có thuộc tính mà nó thường chứa các số nguyên trong bộ sưu tập. Ví dụ: bộ sưu tập có thể tại một thời điểm là:

{ 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 }

Cách tiếp cận đơn giản nhất là sử dụng cây nhị phân cân bằng như bộ C ++ std ::, tuy nhiên, bằng cách đó, tôi không tận dụng thực tế là tôi thường có các số. Có lẽ sẽ tốt hơn để lưu trữ một bộ sưu tập các phạm vi? Nhưng điều đó có nghĩa là một phạm vi cần có thể được chia nhỏ nếu một số nguyên ở giữa của nó bị xóa hoặc được nối với nhau nếu khoảng trống giữa hai phạm vi được điền vào.

Có cấu trúc dữ liệu hiện có nào phù hợp cho vấn đề này không?

Câu trả lời:


9

Tôi đề nghị bạn sử dụng cây tìm kiếm nhị phân, được tăng cường để các lá có thể chứa một khoảng (một chuỗi các số nguyên liên tiếp). Duy trì bất biến rằng các khoảng không trùng nhau và theo thứ tự (theo bất biến cây tìm kiếm). (Đây có thể được coi là trường hợp đặc biệt của cây khoảng hoặc cây phân đoạn, đối với trường hợp đặc biệt khi các khoảng không trùng nhau.)

Cấu trúc dữ liệu này bạn có thể hỗ trợ tất cả các hoạt động của mình trong thời gian , trong đó là số lượng khoảng. Vì chúng tôi đảm bảo , tôi hy vọng điều này sẽ khá hiệu quả. (Cụ thể, có, bạn có thể chia một khoảng thành hai phần hoặc hợp nhất hai khoảng liền kề thành một khoảng duy nhất trong thời gian .)n n 65535 O ( lg n )O(lgn)nn65535O(lgn)


5

Trước hết, câu hỏi của bạn được diễn đạt rất kém, nếu không vì lý do nào khác vì "nhanh chóng" không có nghĩa gì nhiều. Bạn sẽ cần cung cấp một số số liệu về "nhanh" nghĩa là gì.

Ngoài ra, khi cố gắng đưa ra một thiết kế cho một vấn đề, trước tiên bạn cần phải hiểu rõ vấn đề và hỏi rất nhiều câu hỏi bổ sung . Các câu hỏi có liên quan trong trường hợp này dường như là (không theo thứ tự cụ thể):

  • Tất cả các hoạt động này phải nhanh như nhau, hoặc một số quan trọng hơn các hoạt động khác?
  • Có những cân nhắc khác?
  • Có phải bộ nhớ là một mối quan tâm ở tất cả?
  • Là khả năng thực hiện chèn, loại bỏ và tra cứu từ nhiều chủ đề là một mối quan tâm?
  • Là khối lượng công việc chủ yếu tập trung vào chèn? Loại bỏ? Nhìn lên?

Thứ hai, nếu miền vấn đề của bạn thực sự là thì cuộc thảo luận này có vẻ chỉ là ngớ ngẩn. Là một thuật toán thông minh, ưa thích thực sự cần thiết? Đặc biệt là khi một mảng đơn giản là một lựa chọn tuyệt vời, bao gồm các hoạt động số nguyên duy nhất trong thời gian không đổi, các hoạt động phạm vi trong thời gian tuyến tính và chi phí không gian tuyến tính?[0,65535]

Đối với công việc nhiều hơn một chút, bạn có thể tiết kiệm dung lượng nếu đó là vấn đề đáng lo ngại, với chi phí tốc độ bằng cách lưu trữ dữ liệu dưới dạng bit trong 8192 số nguyên. Mặc dù về mặt khái niệm, các hoạt động số nguyên đơn sẽ vẫn là thời gian không đổi và các hoạt động số nguyên có phạm vi vẫn sẽ là thời gian tuyến tính, chúng sẽ chậm hơn.

Vì vậy, nếu đây thực sự là vấn đề của bạn, tôi muốn sử dụng một mảng và chuyển sang những thứ khác, quan trọng hơn với mã.

Nếu đây không thực sự là vấn đề của bạn và có những cân nhắc khác mà bạn chưa chuyển tiếp (ví dụ: có lẽ tên miền không thực sự và bạn đang cố gắng đơn giản hóa vấn đề bạn đang hỏi) thì bạn sẽ cần để hỏi lại câu hỏi của bạn, lần này cho chúng tôi biết vấn đề thực sự .[0,65535]


3

Bạn có thể xem xét cấu trúc dữ liệu Integer như cây Van Emde Boas . Cấu trúc dữ liệu Integer hoạt động trên một vũ trụ cố định . Một số hoạt động bạn đã đề cập có thể được thực hiện rất hiệu quả. Cụ thể, chèn, xóa và yêu cầu một phần tử duy nhất chạy trong . Các hoạt động khác (chèn / xóa hàng loạt) có thể tốn kém hơn, tuy nhiên, bằng cách sử dụng bittricks trên cây Van Emde Boas, bạn sẽ có thể tăng tốc theo hệ số từ về kích thước từ của hệ thống.O ( log log u )U={0,,u1}O(loglogu)

Tùy thuộc vào cấu trúc dữ liệu của bạn, có thể có nhiều cách thay thế thông minh để lưu trữ dữ liệu của bạn.

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.