Thuật toán thời gian tuyến tính xác định để kiểm tra xem một mảng có phải là phiên bản được sắp xếp của mảng kia không


19

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

Đầu vào: hai mảng AB có độ dài n , trong đó B theo thứ tự được sắp xếp.

Truy vấn: làm AB gồm các nội dung tương tự (với đa dạng của mình)?

Thuật toán xác định nhanh nhất cho vấn đề này là gì?
Nó có thể được giải quyết nhanh hơn so với việc sắp xếp chúng? Vấn đề này có thể được giải quyết trong thời gian tuyến tính xác định?


1
FWIW phương pháp xác suất được băm với hàm băm độc lập theo thứ tự. Carter và Wegman đã viết một trong những bài báo gốc về điều này ( scTHERirect.com/science/article/pii/0022000081900337 ), nhưng tôi chưa thấy bất cứ điều gì trong các trích dẫn của bài báo đó cho thấy thuật toán xác định (cho đến nay).
Máy xay sinh tố

1
Tuyên bố bạn trích dẫn là về mô hình máy Turing, chỉ quan tâm đến lý thuyết. Các thuật toán thường được phân tích liên quan đến mô hình RAM.
Yuval Filmus 17/05/2016

ah, đó là mô hình tôi đang tìm kiếm. Tôi điều chỉnh câu hỏi.
Albert Hendriks

Tại sao bạn không chỉ tổng hợp các mục trong mảng và sau đó so sánh tổng kết? Về tiêu đề của bạn, nó là tuyến tính và trả lời câu hỏi 'là một mảng phiên bản được sắp xếp của khác? '. Tôi biết rằng đó không phải là mô hình máy Turing, mà là một giải pháp thực tế.
atayenel

1
@AlbertHendriks Bạn (rất có thể) không thể sắp xếp một mảng trong O(nlogn) trên máy Turing. Một số giới hạn thấp hơn về SAT (ví dụ: cs.cmu.edu/~ryanw/automated-lbs.pdf ) thực sự dành cho máy RAM, xin lỗi vì nhận xét sai lệch trước đây của tôi.
Yuval Filmus

Câu trả lời:


14

Bạn chưa chỉ định mô hình tính toán của mình, vì vậy tôi sẽ giả sử mô hình so sánh.

Hãy xem xét các trường hợp đặc biệt, trong đó mảng được lấy từ danh sách { 1 , 2 } × { 3 , 4 } × × { 2 n -B Nói cách khác,phần tử thứ i 2 i - 1 hoặc 2 i .

{1,2}×{3,4}××{2n1,2n}.
i2i12i

Tôi khẳng định rằng nếu thuật toán kết luận rằng B chứa các phần tử giống nhau, thì thuật toán đã so sánh từng phần tử trongAB để đối tác của Một . Thật vậy, giả sử rằng các thuật toán kết luận rằng A B chứa các yếu tố tương tự, nhưng không bao giờ so sánh các yếu tố đầu tiên của B để đối tác của Một . Nếu chúng ta chuyển đổi phần tử đầu tiên thì thuật toán sẽ tiến hành theo cùng một cách, mặc dù câu trả lời là khác nhau. Này cho thấy rằng các thuật toán phải so sánh các yếu tố đầu tiên (và bất kỳ yếu tố khác) để đối tác của Một .BAABBAA

Điều này có nghĩa rằng nếu B chứa các yếu tố tương tự, sau đó sau khi xác minh này các thuật toán biết trình tự sắp xếp của Một . Do đó nó phải có ít nhất n ! lá khác nhau, và vì vậy nó cần có thời gian Ω ( n log n ) .ABAn!Ω(nlogn)


Tôi đã có thể nghĩ điều này sẽ có nghĩa là P=Ω(nlogn) nói chung, nhưng dường như mô hình so sánh là khác nhau với điều đó.
Albert Hendriks

@AlbertHendriks, đó là mô hình tương tự được sử dụng để hiển thị n lg n giới hạn dưới để sắp xếp. Nó có nghĩa là hoạt động duy nhất bạn có thể thực hiện là so sánh thì bạn không thể làm tốt hơn. Tôi nghĩ rằng điều này trả lời câu hỏi của bạn.
Kaveh

[Cntd] chúng tôi không có giới hạn mạnh hơn ngay cả để sắp xếp! và nếu bạn có thể sắp xếp nhanh hơn n lg n thì bạn có thể sử dụng nó để giải quyết vấn đề nhanh hơn n lg n.
Kaveh

1
@AlbertHendriks, bạn có biết về thuật toán thời gian tuyến tính để sắp xếp các số nguyên không? Tra cứu nó trong CLRS. Trường hợp của bạn có thể là một trong những trường hợp chúng ta có thể sắp xếp theo thời gian tuyến tính.
Kaveh

6
Số nguyên có thể được sắp xếp trong (xemnada.kth.se/~snilsson/fast-sorting), hoặc trong thời gian dự kiến O ( n O(nloglogn)(xemieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1181890) hoặc thậm chí trong thời gian tuyến tính nếu kích thước từ đủ lớn (xem LNCS 8503, trang 26ff). O(nloglogn)
Yuval Filmus

10

Câu trả lời này xem xét một mô hình tính toán khác: mô hình RAM chi phí đơn vị. Trong mô hình này, các từ máy có kích thước và các thao tác trên chúng mất thời gian O ( 1 ) . Chúng tôi cũng giả sử cho đơn giản rằng mỗi phần tử mảng phù hợp với một từ máy (và tối đa là n O ( 1 ) về độ lớn).O(logn)O(1)nO(1)

Chúng tôi sẽ xây dựng một thời gian tuyến tính ngẫu nhiên thuật toán với một chiều lỗi (các thuật toán có thể khai báo hai mảng để chứa các yếu tố tương tự ngay cả khi đây không phải là trường hợp) cho các vấn đề khó khăn hơn trong việc xác định liệu hai mảng b 1 , ... , b n chứa các yếu tố tương tự. (Chúng tôi không yêu cầu bất kỳ ai trong số họ được sắp xếp.) Thuật toán của chúng tôi sẽ gây ra lỗi với xác suất nhiều nhất là 1 / n .a1,,anb1,,bn1/n

Ý tưởng là bản sắc sau giữ khi và chỉ khi các mảng chứa các yếu tố giống nhau: Việc tính toán các đa thức này chính xác sẽ mất quá nhiều thời gian. Thay vào đó, chúng tôi chọn một số nguyên tố ngẫu nhiên p và ngẫu nhiên một x 0 bài kiểm tra và xem n Π i = 1 ( x 0 - một i ) n Π

i=1n(xai)=i=1n(xbi).
px0 Nếu các mảng bằng nhau, kiểm tra sẽ luôn vượt qua, vì vậy hãy tập trung vào các trường hợp trong đó các mảng khác nhau. Đặc biệt, một số hệ số Π n i = 1 ( x - một i ) - Π n i = 1 ( x - b i ) không phải là zero. Vì a i , b i có độ lớn n O ( 1 ) , hệ số này có độ lớn 2 n n O (
i=1n(x0ai)i=1n(x0bi)(modp).
i=1n(xai)i=1n(xbi)ai,binO(1)2nnO(n)=nO(n) , và do đó, nó có nhiều nhất các thừa số nguyên tố có kích thước Ω ( n ) . Điều này có nghĩa rằng nếu chúng ta chọn một bộ ít nhất n 2 số nguyên tố p kích thước ít nhất n 2 (nói), sau đó cho một số nguyên tố ngẫu nhiên p của bộ này nó sẽ tổ chức với xác suất ít nhất 1 - 1 / nn Π i = 1 ( x - a i )O(n)Ω(n)n2pn2p11/n Một ngẫu nhiên x 0 modulo p sẽ chứng kiến này với xác suất 1 - n / p 1 - 1 / n (vì một đa thức bậc nhất n
i=1n(xai)i=1n(xbi)0(modp).
x0p1n/p11/nn có ít nhất rễ).n

Tóm lại, nếu chúng tôi chọn ngẫu nhiên kích thước xấp xỉ n 2 trong một bộ ít nhất n 2 số nguyên tố khác nhau, và một ngẫu nhiên x 0 modulo p , sau đó khi các mảng không chứa các yếu tố tương tự, thử nghiệm của chúng tôi sẽ thất bại với xác suất 1 - O ( 1 / n ) . Chạy thử nghiệm mất thời gian O ( n )p phù hợp với số lượng từ máy không đổi.pn2n2x0p1O(1/n)O(n)p

Sử dụng kiểm tra tính nguyên thủy thời gian đa thức và vì mật độ của các số nguyên tố có kích thước khoảng Ω ( 1 / log n ) , chúng ta có thể chọn một số nguyên tố p ngẫu nhiên trong thời gian ( log n ) O ( 1 ) . Chọn ngẫu nhiên x 0 modulo pn2Ω(1/logn)p(logn)O(1)x0p có thể được thực hiện theo những cách khác nhau, và được thực hiện dễ dàng hơn vì trong trường hợp của chúng tôi, chúng tôi không cần một hoàn toàn thống nhất ngẫu nhiên .x0

Tóm lại, thuật toán của chúng tôi chạy trong thời gian , luôn luôn xuất CÓ nếu các mảng chứa các phần tử giống nhau và xuất ra NO với xác suất 1 - O ( 1 / n ) nếu các mảng không chứa các phần tử giống nhau. Chúng ta có thể cải thiện xác suất lỗi thành 1 - O ( 1 / n C ) cho bất kỳ hằng số C nào .O(n)1O(1/n)1O(1/nC)C


1
Mặc dù thuật toán này là ngẫu nhiên, nó giải thích cách thực hiện các ý tưởng trong một số câu trả lời khác để chúng thực sự hoạt động. Nó cũng có một lợi thế so với phương pháp hashtable: đó là tại chỗ.
Yuval Filmus

Tôi nghĩ rằng OP không thích các thuật toán xác suất vì anh ta không thích thuật toán thời gian tuyến tính dự kiến ​​sử dụng bảng băm.
Kaveh

Kaveh bạn nói đúng. Nhưng tất nhiên giải pháp này cũng thú vị và nên được giữ lại, nó giải quyết trường hợp cho các thuật toán xác suất. Ngoài ra, tôi nghĩ rằng nó sử dụng mô hình mà tôi đang tìm kiếm.
Albert Hendriks

1
Tôi chỉ tự hỏi nếu ký hiệu O (1 / n) là chính xác. Tất nhiên tôi biết ý của bạn là gì, nhưng tôi nghĩ theo định nghĩa của big-O thì điều này tương đương với O (1).
Albert Hendriks

2
Không có gì. Đó là một đại lượng giới hạn bởi cho n đủ lớn . Đó là một đảm bảo tốt hơn O ( 1 ) . C/nnO(1)
Yuval Filmus

-3

tôi sẽ đề xuất một thuật toán khác (hoặc ít nhất là một sơ đồ của thuật toán đó)

[min,max]

  1. O(n)minmax các giá trị cho cả hai bội số của chúng, nếu chúng khác nhau, các mảng không phải là hoán vị của nhau

  2. Trừ mintất cả các giá trị từ cả hai mảng (ở đây thực tế là một mảng đã được sắp xếp theo thứ tự không được tính đến, có lẽ điều này có thể được cải thiện)

  3. 1c>1

  4. max-minO((maxmin)n)

lưu ý sơ đồ thuật toán trên có thể (xác định) khá nhanh trong nhiều tình huống thực tế.

Sơ đồ thuật toán trên là một biến thể của thuật toán sắp xếp thời gian tuyến tính sử dụng " khối lượng di chuyển ". Trực giác vật lý đằng sau thuật toán sắp xếp " khối lượng di chuyển " là:

Giả sử giá trị của mỗi vật phẩm thực sự đại diện cho cường độ khối lượng của nó và tưởng tượng sắp xếp tất cả các vật phẩm trong một dòng và áp dụng cùng một lực gia tốc.

Sau đó, mỗi vật phẩm sẽ di chuyển lên một khoảng cách liên quan đến khối lượng của nó, khoảng cách lớn hơn ít hơn và ngược lại. Sau đó, để lấy các mục đã sắp xếp, chỉ cần thu thập các mục theo thứ tự ngược lại theo khoảng cách di chuyển.

maxmin

Về mặt này, thuật toán trên tương tự như thuật toán sắp xếp dựa trên số (ví dụ: radix-sort , đếm-sort )

Người ta có thể nghĩ rằng thuật toán này có thể không có nhiều ý nghĩa, nhưng nó cho thấy ít nhất một điều. Rằng, " cơ bản ", ở cấp độ vật lý, sắp xếp các số tùy ý là một hoạt động thời gian tuyến tính trong số lượng các mục.


Về mặt thu thập các mục theo thứ tự ngược của quãng đường đã đi, liệu điều đó có chuyển thành so sánh ở cấp độ thực hiện không và tại thời điểm đó, bạn không phải sắp xếp "khoảng cách"?
JustAntherSoul
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.