Algoritme waktu linear deterministik untuk memeriksa apakah satu array merupakan versi yang diurutkan dari yang lain


19

Pertimbangkan masalah berikut:

Input: dua array A dan B dengan panjang n , di mana B berada dalam urutan urutan.

Pertanyaan: apakah A dan B berisi item yang sama (dengan multiplisitasnya)?

Apa algoritma deterministik tercepat untuk masalah ini?
Apakah bisa diselesaikan lebih cepat daripada menyortirnya? Bisakah masalah ini diselesaikan dalam waktu linier deterministik?


1
FWIW pendekatan probabilistik hashing dengan fungsi hash independen-order. Carter dan Wegman menulis salah satu makalah asli tentang ini ( sciencedirect.com/science/article/pii/0022000081900337 ), tapi saya belum melihat apa pun dalam kutipan makalah yang menunjukkan algoritma deterministik (sejauh ini).
KWillets

1
Pernyataan yang Anda kutip adalah tentang model mesin Turing, yang hanya menarik secara teoritis. Algoritma biasanya dianalisis sehubungan dengan model RAM.
Yuval Filmus

ah, maka itulah model yang saya cari. Saya menyesuaikan pertanyaan.
Albert Hendriks

Mengapa Anda tidak menjumlahkan item dalam array dan kemudian membandingkan penjumlahan? Mengenai judul Anda, ini linear dan menjawab pertanyaan 'apakah satu array merupakan versi yang diurutkan dari yang lain? ' Saya sadar bahwa itu bukan model mesin Turing, tetapi solusi praktis.
atayenel

1
@AlbertHendriks Anda (kemungkinan besar) tidak dapat mengurutkan array di O(nlogn) pada mesin Turing. Beberapa batas bawah pada SAT (misalnya cs.cmu.edu/ ~ryanw/automated-lbs.pdf ) sebenarnya untuk mesin RAM, maaf untuk komentar saya sebelumnya yang menyesatkan.
Yuval Filmus

Jawaban:


14

Anda belum menentukan model perhitungan Anda, jadi saya akan menganggap model perbandingan.

Pertimbangkan kasus khusus di mana array diambil dari daftar { 1 , 2 } × { 3 , 4 } × × { 2 n - 1 , 2 n } . Dengan kata lain, elemen ke- i adalah 2 i - 1 atau 2 i .B

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

Saya mengklaim bahwa jika algoritma menyimpulkan bahwa dan B mengandung unsur-unsur yang sama, bahwa algoritma telah dibandingkan setiap elemen dalam B untuk rekan di A . Memang, anggaplah bahwa algoritma menyimpulkan bahwa A dan B mengandung unsur-unsur yang sama, tetapi tidak pernah membandingkan elemen pertama dari B dengan mitranya di A . Jika kita mengganti elemen pertama maka algoritme akan berjalan dengan cara yang persis sama, meskipun jawabannya berbeda. Ini menunjukkan bahwa algoritma harus membandingkan elemen pertama (dan unsur lainnya) dengan mitranya di A .ABBAABBAA

Ini berarti bahwa jika dan B mengandung elemen yang sama, maka setelah memverifikasi ini algoritma mengetahui urutan A yang diurutkan . Karena itu ia harus memiliki setidaknya n ! daun berbeda, dan karena itu butuh waktu Ω ( n log n ) .ABAn!Ω(nlogn)


Saya akan berpikir ini akan menyiratkan bahwa secara umum, tetapi ternyata model perbandingannya berbeda dengan itu. P=Ω(nlogn)
Albert Hendriks

@AlbertHendriks, ini adalah model yang sama yang digunakan untuk menunjukkan n lg dan batas bawah untuk penyortiran. Ini berarti bahwa satu-satunya operasi yang dapat Anda lakukan adalah perbandingan maka Anda tidak dapat melakukan lebih baik. Saya pikir ini menjawab pertanyaan Anda.
Kaveh

[Cntd] kami tidak memiliki batas yang lebih kuat bahkan untuk menyortir! dan jika Anda dapat mengurutkan lebih cepat dari n lg n maka Anda dapat menggunakannya untuk menyelesaikan masalah lebih cepat dari n lg n.
Kaveh

1
@AlbertHendriks, apakah Anda tahu tentang algoritma waktu linear untuk menyortir bilangan bulat? Cari di CLRS. Kasing Anda mungkin salah satu kasing di mana kami dapat mengurutkan dalam waktu linier.
Kaveh

6
Integer dapat disortir dalam (lihat nada.kth.se/~snilsson/fast-sorting ), atau dalam waktu yang diharapkan O ( n O(nloglogn)(lihatieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1181890), atau bahkan dalam waktu linier jika ukuran kata cukup besar (lihat LNCS 8503, hlm. 26ff). O(nloglogn)
Yuval Filmus

10

O(logn)O(1)nO(1)

a1,,anb1,,bn1/n

i=1n(xai)=i=1n(xbi).
px0n i = 1 ( x - a i ) - n i = 1 ( x - b i ) a i , b i n O ( 1 ) 2 n n O ( n ) = n O ( n ) O ( n ) Ω ( n ) n 2 p n
i=1n(x0ai)i=1n(x0bi)(modp).
Jika array sama, tes akan selalu berlalu, jadi mari kita berkonsentrasi pada kasus di mana array berbeda. Secara khusus, beberapa koefisien adalah tidak nol. Karena memiliki magnitudo , koefisien ini memiliki magnitudo , dan memiliki paling banyak prime faktor ukuran . Ini berarti bahwa jika kita memilih set setidaknya bilangan prima ukuran setidaknya (katakanlah), maka untuk prime acak dari set ini akan berlaku dengan probabilitas setidaknya yang i=1n(xai)i=1n(xbi)ai,binO(1)2nnO(n)=nO(n)O(n)Ω(n)n2pn2p11/n
i=1n(xai)i=1n(xbi)0(modp).
Modulo acak akan menyaksikan ini dengan probabilitas (karena polinomial derajat paling banyak memiliki paling banyak akar).x0p1n/p11/nnn

Kesimpulannya, jika kita memilih ukuran acak kira-kira antara sekumpulan setidaknya bilangan prima yang berbeda, dan modulo acak , maka ketika array tidak mengandung elemen yang sama, pengujian kami akan gagal dengan probabilitas . Menjalankan tes membutuhkan waktu karena cocok dengan jumlah kata mesin yang konstan.pn2n2x0p1O(1/n)O(n)p

Menggunakan pengujian waktu polinomial waktu dan karena densitas bilangan prima ukuran kira-kira adalah , kita dapat memilih prime waktu secara acak . Memilih acak modulo dapat diimplementasikan dalam berbagai cara, dan dibuat lebih mudah karena dalam kasus kami, kami tidak perlu acak-benar seragam .n2Ω(1/logn)p(logn)O(1)x0px0

Kesimpulannya, algoritma kami berjalan dalam waktu , selalu menampilkan YA jika array berisi elemen yang sama, dan menghasilkan TIDAK dengan probabilitas jika array tidak mengandung elemen yang sama. Kita dapat meningkatkan probabilitas kesalahan untuk untuk setiap konstan .O(n)1O(1/n)1O(1/nC)C


1
Meskipun algoritma ini diacak, itu menjelaskan bagaimana menerapkan ide-ide dalam beberapa jawaban lain sehingga mereka benar-benar berfungsi. Ini juga memiliki keunggulan dibandingkan pendekatan hashtable: itu ada di tempat.
Yuval Filmus

Saya pikir OP tidak suka algoritma probabilistik karena dia tidak suka algoritma waktu linier yang diharapkan menggunakan tabel hash.
Kaveh

Kaveh kamu benar. Tetapi tentu saja solusi ini juga menarik dan harus dijaga, itu memecahkan kasus untuk algoritma probabilistik. Juga, saya pikir itu menggunakan model yang saya cari.
Albert Hendriks

1
Saya hanya ingin tahu apakah notasi O (1 / n) sudah benar. Tentu saja saya tahu apa yang Anda maksud, tapi saya pikir dengan definisi big-O ini setara dengan O (1).
Albert Hendriks

2
Tidak semuanya. Kuantitas yang dibatasi oleh cukup besar untuk . Itu jaminan yang lebih baik daripada . C/nnO(1)
Yuval Filmus

-3

saya akan mengusulkan algoritma lain (atau setidaknya skema algoritma seperti itu)

Skema ini mengasumsikan nilai-nilai (diasumsikan " bilangan bulat ") berada dalam kisaran (sempit?) Antara[min,max]

  1. Dalam waktu memindai dua array, kita dapat menemukan dan nilai untuk keduanya dan multiplisitasnya, jika ini berbeda, array tidak permutasi satu sama lainO(n)minmax

  2. Kurangi mindari semua nilai dari kedua array (di sini fakta bahwa satu array sudah dalam urutan diurutkan tidak diperhitungkan, mungkin ini dapat ditingkatkan)

  3. Asumsikan nilai dalam array mewakili massa dan kami menerapkan akselerasi / kecepatan untuk masing-masing besarnya (ini dapat ditingkatkan ke besarnya dalam kasus-kasus tertentu)1c>1

  4. gerakkan massa hingga mencapai nilai maksimum max-min, ini memiliki kompleksitas . Hal ini memungkinkan untuk menemukan nilai yang sama dan multiplisitasnya, jika berbeda, array tidak permutasi satu sama lain. Lain memutuskan array adalah permutasi satu sama lain.O((maxmin)n)

perhatikan skema algoritma di atas dapat (deterministik) cukup cepat dalam banyak situasi praktis.

Skema algoritma di atas adalah variasi pada algoritma pengurutan linear-waktu menggunakan " massa bergerak ". Intuisi fisik di balik algoritma pengurutan " massa bergerak " adalah sebagai berikut:

Asumsikan nilai setiap item sebenarnya mewakili besarnya massa dan bayangkan mengatur semua item dalam garis dan menerapkan gaya akselerasi yang sama.

Kemudian setiap item akan bergerak ke jarak yang terkait dengan massanya, jarak lebih besar lebih kecil dan sebaliknya. Kemudian untuk mengambil item yang diurutkan cukup mengumpulkan item dalam urutan terbalik berdasarkan jarak yang ditempuh.

Algoritma ini linear-waktu dan deterministik , tetapi ada peringatan bahwa jumlah gaya akselerasi awal dan jarak untuk melakukan perjalanan (atau waktu untuk menunggu) terkait dengan distribusi nilai (yaitu " massa ", faktor di atas). Satu juga dapat mencoba untuk mendiskritasikan ruang untuk item untuk melakukan perjalanan ke kotak dan mendapatkan faktor konstan dalam kecepatan algoritma (dan menggunakan rutin penyortiran cepat untuk mengurutkan item yang berbeda dalam sel yang sama ).maxmin

Dalam hal ini, algoritma di atas mirip dengan algoritma pengurutan berbasis numerik (mis. Radix-sort , menghitung-sort )

Orang mungkin berpikir bahwa algoritma ini mungkin tidak berarti banyak, tetapi itu menunjukkan setidaknya satu hal. Bahwa, " mendasar ", pada tingkat fisik, menyortir angka acak adalah operasi linier dalam jumlah item.


Dalam hal mengumpulkan barang-barang dalam urutan terbalik jarak yang ditempuh, bukankah itu berarti perbandingan di tingkat implementasi, dan pada titik itu Anda tidak perlu menyortir "jarak"?
JustAnotherSoul
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.