Chúng ta có thể làm tốt hơn


7

Tôi (thật ngu ngốc hóa ra) tự tin rằng câu trả lời cho câu hỏi này là không. Vậy tại sao tôi hỏi?

Bởi vì Tiến sĩ Aleksandar Prokopec tại EPFL trong khóa học lập trình song song của mình giới thiệu một cấu trúc dữ liệu mà ông khẳng định các thuộc tính khác nhau. Nếu các thuộc tính này giữ thì dường như tôi có thể xây dựng một cây nhị phân cân bằng trong thời gian tốt hơn .Ôi(nđăng nhậpn)

Tôi không tin điều này vì vậy tôi tự hỏi lỗ hổng trong suy nghĩ của tôi ở đâu.

Cấu trúc dữ liệu là danh sách cây conc . Ở dạng chuẩn, nó trông giống như một cây nhị phân bình thường và đi kèm với một concatthao tác đảm bảo bất biến rằng các nhánh con bên trái và bên phải của bất kỳ nút nào không bao giờ khác nhau về chiều cao nhiều hơn một. Như mong đợi concatcó độ phức tạp .Ôi(đăng nhậpn)

Nhưng có một biến thể xây dựng của danh sách cây được gọi là Appenddanh sách. Biến thể này cho phép chênh lệch chiều cao tạm thời trong các cây con nhiều hơn một. Khấu trừ thời gian bổ sung được yêu cầu cho biến thể này.Ôi(1)

Vì vậy, có vẻ như nối thêm phần tử phải có độ phức tạp là .nÔi(n)

Tuy nhiên, một đặc điểm của biến thể này là bất cứ khi nào là lũy thừa của hai thì kết thúc bằng một cây nhị phân cân bằng hoàn chỉnh (chứa tất cả các phần tử được chèn cho đến nay). Vì vậy, trong khi sự mất cân bằng tạm thời được cho phép, cây trở nên cân bằng mỗi sức mạnh của 2 lần chèn.n

Trong biến thể này, một lớp nút mới, được gọi là Appendcác nút, được giới thiệu và đó là các nút có cây con được phép có chiều cao khác nhau nhiều hơn một. Tuy nhiên, cứ sau tất cả các nút tạm thời như vậy sẽ bị loại bỏ.2k

Các trang Wikipedia trang mô tả các thuật toán khá ngắn gọn (xem mô tả về các cấu trúc dữ liệu cơ bản và các appendphương pháp đặc biệt).

Vậy khi nào n là một sức mạnh của hai chi phí của chúng tôi để chèn các yếu tố là Ôi(n)và chúng tôi đã xây dựng một cây nhị phân cân bằng. Hoặc có vẻ như vậy.

Trong một câu hỏi riêng tôi đã hỏi một cách hiệu quả "nếu tôi có thể nêu số bước cho một thuật toán cho các giá trị nhất định củan, vd n= =2k, Ở đâu k là một số nguyên, điều này có đủ để cho phép tôi nêu độ phức tạp cho tất cả các giá trị của n? "

Tôi có thể thấy từ câu trả lời của Yuval Filmus rằng câu trả lời là không, nhưng đó là "trong nhiều trường hợp chúng ta mong đợiT trở nên đơn điệu trong n. Trong trường hợp đó, việc khấu trừ không giữ được. "

Vì vậy, dường như trong trường hợp này nếu chèn n các yếu tố có độ phức tạp Ôi(n) và mọi thứ 2k các phần tử Tôi có một cây nhị phân cân bằng thì chi phí xây dựng cây nhị phân cân bằng với cách tiếp cận biến thể cây này phải là Ôi(n).

Vậy có gì sai ở đây? Thành thật mà nói tôi không thể thấy được khấu haoÔi(1)chắp thêm thời gian yêu cầu cho biến thể này. Tôi có thể thấy rằng thường xuyên chèn thêm có chi phíÔi(1)nhưng khi nhìn vào những gì đang xảy ra với các Appendnút tạm thời , chi phí chèn tổng thể sẽ bị khấu haoÔi(đăng nhậpn).

Nếu đây là trường hợp sau đó xây dựng cây nhị phân cân bằng của chúng tôi có một không ngạc nhiên Ôi(nđăng nhậpn) Giá cả.

Xin lỗi vì một câu hỏi dài như vậy và xin lỗi vì đã không đi sâu vào chi tiết về thuật toán được đề cập - thay vào đó, khiến bạn phải tìm kiếm trên Wikipedia.


2
Hãy dừng việc nối các câu hỏi mới vào câu hỏi của bạn. Nếu câu hỏi ban đầu của bạn được trả lời, hãy bắt đầu một câu hỏi khác với bất kỳ câu hỏi hoặc nhầm lẫn nào bạn có không liên quan trực tiếp đến câu hỏi ban đầu. Câu hỏi trong trạng thái hiện tại của nó đã chuyển hướng hoàn toàn từ tiêu đề.
aelguindy

1
Xin lỗi vì đã thêm vào đây theo phong cách của một cuộc thảo luận đang diễn ra thay vì bám sát phong cách hỏi đáp. Tôi sẽ đánh dấu câu hỏi này là câu trả lời và cố gắng hình thành, như một câu hỏi riêng biệt, việc tôi không được khấu haoÔi(1)trong phân tích hiện tại của tôi về appendhoạt động.
George Hawkins

Phiên bản mở rộng của câu hỏi này đã được gửi vào lịch sử chỉnh sửa . Mặc dù tôi đánh giá cao câu trả lời từ @ gnasher729 Tôi hơi ngạc nhiên khi nó có rất nhiều phiếu bầu vì câu hỏi chắc chắn là về cây nhị phân chứ không phải cây tìm kiếm nhị phân . Sự nhầm lẫn của tôi với sự phức tạp của cái này với cái kia không thay đổi điều đó. Tương tự, câu hỏi đã được đặt lại từ cây nhị phân sang cây tìm kiếm có vẻ không chính xác.
George Hawkins

Câu trả lời:


7

Nếu tôi hiểu chính xác câu hỏi của bạn, thì tất nhiên bạn có thể xây dựng một cây nhị phân cân bằng trong Ôi(n)thời gian. Đây là một mã giả đơn giản:

L = [2, 4, 1, 3, 5, 6, 8]
q = Queue()
node root{value = L[0]}
q.add(root)
k = 1
while !q.isEmpty:
  n = q.pop
  if k < L.size:
     n.left = node{value=L[k]}
     k++
     q.add(n.left)
  if k < L.size:
     n.right = node{value=L[k]}
     k++
     q.add(n.right)

Không khó để thấy rằng mã này chạy trong thời gian tuyến tính và xây dựng một cây nhị phân cân bằng.

Những gì bạn không thể làm, là xây dựng một cây tìm kiếm nhị phân (đã ra lệnh) cân bằng trongÔi(n)thời gian (chỉ sử dụng so sánh trên các giá trị). Thuật toán ở trên không đảm bảo rằng giá trị trên gốc lớn hơn hoặc bằng mọi giá trị trong cây con bên trái và nhỏ hơn hoặc bằng mọi giá trị trong cây con bên phải, cho mỗi cây con.

Thuật toán ở trên không đảm bảo nó và cũng không phải là cây conc-conc (sử dụng các phần phụ và phần bổ sung). Từ trang wikipedia, nó chỉ đảm bảoÔi(1)thời gian khấu hao cho gắn thêmprepends . Đối với chèn, nó chỉ có thể đảm bảoÔi(đăng nhậpn) thời gian.


Lần thứ hai sau bao nhiêu ngày tôi cảm thấy khá ngu ngốc khi tự tin khẳng định điều gì đó ở đây hóa ra là sai, trên cơ sở một nửa bài giảng được nhớ từ 20 năm trước. Trong ví dụ của bạn, bạn xây dựng một loại cây hơi khác với cây conc-conc, trong đó chỉ có các lá có giá trị, nhưng điều đó chỉ làm tăng số lượng nút (lá và nút bên trong)2n-1 vì vậy sự phức tạp vẫn như trong trường hợp của bạn Ôi(n). Bây giờ tôi đang tự hỏi nếu có bất cứ điều gì thông minh về appendhoạt động của cây conc-tree . Tôi đã thêm một phần khác vào cuối câu hỏi đã dài của tôi.
George Hawkins

@GeorgeHawkins không phải lo lắng, đó là một sự nhầm lẫn phổ biến :). Ví dụ của tôi không đặt các nút trên lá, nó đặt các giá trị tại tất cả các nút của cây. Có một số điều rất thông minh về cây che giấu, cố gắng đưa ra cấu trúc dữ liệu đạt được giới hạn tương tự sẽ cho bạn thấy lý do tại sao nó thông minh. Ví dụ: nếu bạn muốn nối nhanh, bạn có thể muốn sử dụng danh sách được liên kết, nhưng sau đó làm thế nào để bạn truy cập các yếu tố nội bộ một cách nhanh chóng?
aelguindy 6/11/2016

Cuối cùng tôi đã thêm cập nhật của tôi vào câu hỏi của tôi. Ở giai đoạn này, tôi nghĩ rằng tôi quan tâm nhất đến những gì bạn đề cập đến như sự thông minh của cấu trúc dữ liệu conc-tree. Tôi có thể thấy cây có điểm cộng trên danh sách (trong đó cần có một số đặc điểm nhất định) nhưng tôi không rõ ràng về điểm cộng của cây so với việc triển khai cây khác. Ngay cuối câu hỏi của tôi, tôi đã thêm một vài suy nghĩ dọc theo những dòng này. Nhưng quan trọng là tôi vẫn không thể thấy được khấu haoÔi(1) chắp thêm thời gian :( Phân tích của tôi về những gì đang xảy ra trong trường hợp 2k nối thêm vẫn dẫn tôi đến một khoản khấu hao không chính xác Ôi(đăng nhậpn).
George Hawkins

2
Câu hỏi của bạn đang trở nên thực sự lớn và đang chuyển hướng từ tiêu đề của câu hỏi của bạn. Tôi nghĩ rằng bạn có thể muốn hỏi một vài câu hỏi riêng biệt.
aelguindy

2
Tái thông minh của cây conc conc, hãy thử thực hiện một cây giữ cho nó cân bằng với các phụ lục và thêm vào Ôi(1)khấu hao thời gian và bạn sẽ thấy lý do tại sao cây thông minh là thông minh. Ngoài ra, hãy thử nghĩ cách thực hiện concat cho hai cây nhị phân.
aelguindy

6

Thêm vào câu trả lời của aelguindy: Bạn không thể đặt n mục chưa sắp xếp vào bất kỳ loại cấu trúc dữ liệu nào, sau đó liệt kê chúng theo thứ tự được sắp xếp, tốt hơn tổng thời gian O (n log n) - bởi vì nếu bạn có thể, thì bạn có thể sắp xếp một mảng trong thời gian tốt hơn O (n log n).

Nếu chúng ta định nghĩa cấu trúc dữ liệu "được sắp xếp" là bất kỳ cấu trúc dữ liệu nào có thể được liệt kê theo thứ tự được sắp xếp theo thời gian O (n), thì chúng ta không thể tạo bất kỳ cấu trúc dữ liệu được sắp xếp nào nhanh hơn trong O (n log n). Điều đó sẽ bao gồm các cây được sắp xếp, cả cân bằng và không cân bằng.

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.