Tính duy nhất của yếu tố có thể được giải quyết trong thời gian tuyến tính xác định?


9

Hãy xem xét vấn đề sau:

Đầu vào : liệt kê của số nguyênX,Y

Mục tiêu : xác định xem có tồn tại một số nguyên trong cả hai danh sách hay không.x

Giả sử cả hai danh sách đều có kích thước . Có một thuật toán xác định, thời gian tuyến tính cho vấn đề này? Nói cách khác, bạn có thể giải quyết vấn đề này trong thời gian xác định, mà không sử dụng tính ngẫu nhiên không?n O ( n )X,YnÔi(n)

Thật không may, bạn không thể cho rằng các thành phần danh sách đều nhỏ.


Tôi có thể thấy làm thế nào để giải quyết nó trong dự kiến thời gian sử dụng một thuật toán ngẫu nhiên: ngẫu nhiên chọn một 2-phổ hàm băm , lưu trữ các phần tử của vào một Hashtable (sử dụng là hàm băm), và sau đó nhìn lên từng phần tử của để xem nó có trong hashtable không. Thời gian chạy dự kiến ​​sẽ là . Tuy nhiên, tôi không thể thấy cách tìm thuật toán xác định với thời gian chạy . Nếu bạn cố gắng giải mã điều này và sửa một hàm băm cụ thể, sẽ tồn tại một trường hợp xấu nhất khiến quy trình này chạy trongh X h Y O ( n ) O ( n ) Θ ( n 2 )Ôi(n)hXhYÔi(n)Ôi(n)Θ(n2)thời gian. Thuật toán xác định tốt nhất tôi có thể tìm thấy liên quan đến việc sắp xếp các giá trị, nhưng đó sẽ không phải là thời gian tuyến tính. Chúng ta có thể đạt được thời gian chạy tuyến tính?

Ngoài ra, tôi có thể xem cách giải quyết nó trong thời gian tuyến tính nếu bạn giả sử rằng tất cả các phần tử danh sách là các số nguyên trong phạm vi (về cơ bản, thực hiện đếm sắp xếp) - nhưng tôi quan tâm đến những gì xảy ra trong chung trường hợp khi chúng ta không thể cho rằng.[1,n]

Nếu câu trả lời phụ thuộc vào mô hình tính toán, mô hình RAM sẽ nhảy vào tâm trí, nhưng tôi sẽ quan tâm đến kết quả cho bất kỳ mô hình tính toán hợp lý nào. Tôi biết về giới hạn thấp hơn cho thuật toán cây quyết định về tính duy nhất của phần tử , nhưng điều này không dứt khoát, vì đôi khi chúng ta có thể tìm thấy thuật toán thời gian tuyến tính ngay cả khi có ràng buộc trong mô hình cây quyết định.Ω ( n log n )Ω(nđăng nhậpn) Ω(nđăng nhậpn)


Hashtables là O (n log n) khi bạn cần xử lý va chạm.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen, tôi không thấy bạn đang lấy thứ đó từ đâu. Sử dụng các hàm băm 2 phổ và bảng băm có kích thước phù hợp đảm bảo rằng số lượng va chạm băm là tối thiểu (với xác suất cao), vì vậy tôi tin rằng thời gian chạy là có thể đạt được. Tôi không chắc bạn đã lấy từ đâu; nếu bạn không làm điều gì đó đặc biệt (như sử dụng băm 2 phổ), trường hợp xấu nhất là , do va chạm. O ( n lg n ) O ( n 2 )Ôi(n)Ôi(nlgn)Ôi(n2)
DW

Ma quỷ nằm trong chi tiết, ở đây là "bảng băm có kích thước phù hợp". Điều này có thể trở nên khá lớn, nếu bạn không muốn va chạm. N-log-n điển hình là (nếu tôi nhớ chính xác) để xử lý các xung đột hàm băm với một danh sách.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen Số lượng khóa dự kiến ​​ánh xạ tới cùng một địa chỉ là không đổi (đối với các bảng không bị quá tải), do đó loại giải quyết va chạm là không liên quan. Xem thêm tại đây . phù hợp với trường hợp xấu nhất nếu bạn sử dụng các BST cân bằng (bên ngoài) thay vì danh sách. Ôi(nđăng nhậpn)
Raphael

Câu trả lời:


1

Bạn có thể giải quyết vấn đề theo thời gian tuyến tính nếu bạn có đủ bộ nhớ để có một bit cho mỗi giá trị có thể có trong X và Y. Điều này không áp đặt bất kỳ hạn chế nào đối với thứ tự của X và Y.

  1. Ban đầu tất cả các bit không được đặt.
  2. Lặp lại trên X thiết lập bit tương ứng.
  3. Lặp lại kiểm tra Y nếu bit tương ứng được đặt ở trên.

2
Thật không may, bạn không thể cho rằng tất cả các số nguyên đều nhỏ (bạn không thể cho rằng chúng đủ nhỏ để thuật toán này hoạt động). Trong trường hợp chung, thời gian chạy của thuật toán này sẽ theo cấp số nhân theo độ dài bit của các thành phần danh sách. Cảm ơn bạn mặc dù!
DW

Hãy đặt tên cho nó là "mảng bit có kích thước phù hợp". Ngoài ra tuyến tính trong độ dài bit tương đương với log-n. Bạn có nghiêm túc về việc có được hiệu suất log-n mà không có bất kỳ hạn chế hoặc điều kiện tiên quyết nào đối với dữ liệu đầu vào không?
Thorbjørn Ravn Andersen

2
@ ThorbjørnRavnAndersen Không gian theo cấp số nhân theo độ dài bit (bạn cần ánh xạ từ tất cả các giá trị có thể) và thời gian là tuyến tính trong tổng kích thước danh sách (bạn cần xem tất cả các giá trị trong cả hai danh sách). Không có gì là tuyến tính trong chiều dài bit.
wchargein

0

Vì bạn đang nói rằng hai danh sách chứa số nguyên, tôi đoán rằng chúng ta có thể chạy một loại cơ số trên hai danh sách và sau đó thực hiện tìm kiếm tuyến tính so sánh hai danh sách cho các mục tương đương.


4
Điều này chỉ hoạt động nếu có một ràng buộc về độ lớn của các con số.
Luke Mathieson

nhưng tôi nghĩ cường độ cao sẽ chỉ là vấn đề khi đếm sắp xếp và đối với loại cơ số chúng ta có thể chọn một cơ số đủ cao để giải quyết vấn đề đó ... xin vui lòng cho tôi biết những gì tôi đang thiếu ở đây
anirudh

Nếu một trong các số là 2 ^ (2 ^ 128) thì sao?
miniBill

@anirudh nhưng sau đó bạn có một thuật toán khác nhau cho các kích cỡ đầu vào khác nhau - bạn cần một bảng chữ cái lớn hơn mỗi khi bạn tăng cơ số, bạn chỉ xuất khẩu độ phức tạp của việc tăng cường độ để tăng kích thước bảng chữ cái. Tất nhiên, điều này chỉ có thể trên lý thuyết, tôi không nghĩ nhiều phần cứng cho phép bạn thay đổi cơ sở nào đại diện cho số đó (chúng ta có thể giả vờ ở đầu vào và đầu ra, nhưng nó biến thành (hầu hết) nhị phân ).
Luke Mathieson

0

Ôi(nm¯)m¯


Ôi(n)Ôi(n\ thanh ngangm)

wmm¯Ôi(n)

w

wnmnnm

-1

Ôi(nđăng nhậpn)


1
Câu hỏi khá rõ ràng về thời gian xác định tuyến tính, không phải log-linear. Ngoài ra, để xác định xem (không dựa trên giá trị nào), chỉ có các phần tử duy nhất bạn có thể thực hiện nhanh hơn loglinear.
Ác

1
Ω(nđăng nhậpn)

1
Ω(nđăng nhậpn) Ω(nđăng nhậpn)

Ôi(nđăng nhậpđăng nhậpn)Ôi(nđăng nhậpn)Ω(nđăng nhậpn)
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.