Kompleksitas penyortiran

8

Tidak sulit untuk menunjukkan bahwa mengurutkan array angka sulit untuk . Jika input adalah array dari 1s dan 0s maka pada dasarnya fungsi (diberikan bit, output jumlah 1s dalam biner) karena lengkap untuk dan dimungkinkan untuk mengkonversi angka unary ke angka biner dan (logaritmik) angka biner kecil ke angka unary di : C o u n t n C o u n t T C 0 A C 0TC0CountnCountTC0AC0

Count(x)=Binary(Sort(x))
Sort(x)=Unary(Count(x))

Jadi kekuatan pada dasarnya menyortir string biner (mis. 100011 hingga 000111). Ini berlaku lebih umum ketika angka-angka dalam array dibatasi. Pertanyaan saya adalah bagaimana jika jumlahnya tidak dibatasi?TC0

Apakah masalah pengurutan array nomor tidak terikat masih di ? Apakah lengkap untuk kelas yang lebih besar seperti ?TC0NC1

Kaveh
sumber
Btw, jika Anda tahu referensi untuk "menyortir array bit adalah -complete" tolong beri tahu saya. TC0
Kaveh
Apakah Anda memeriksa Cook & Nguyen?
Yuval Filmus
2
@ Kaveh, pengurangan ada di Chandra, Stockmeyer dan Vishkin, "Konstan Pengurangan Kedalaman", SIAM J. Comput. 13 (2), 1984.
Jan Johannsen

Jawaban:

9

Misalkan Anda memiliki angka x 1 , , x n lebar m log n . Tanpa kehilangan keumuman, semua angka berbeda (tambahkan log ekstra dan bit urutan lebih rendah). Dua angka dapat dibandingkan dalam AC 0 , jadi dalam AC 0 kita dapat menghitung, untuk setiap x i , vektor biner v , yang didefinisikan oleh v j = 1 jika x jx i . Di TC 0 kita bisa mengurutkan v kenx1,...,xnmcatatanncatatannxsayavvj=1xjxiv , dan kemudian cari (di AC0) posisi k sehingga w k = 1 sedangkan w k - 1 = 0 (di mana w 0 = 0 , w n + 1 = 1 ). Dengan nilai-nilai ini k untuk setiap i [ n ] , kita dapat menghitung array yang diurutkan dalam AC0. Secara total, kami mendapatkansirkuitTC0.wkwk=1wk1=0w0=0wn+1=1ki[n]

Yuval Filmus
sumber
trik yang bagus :) (hitung jumlah angka yang lebih kecil dalam array), terima kasih Yuval.
Kaveh