Menentukan angka tertentu dalam

10

Karena SEBUAH[1..n] adalah bilangan bulat sehingga 0A[k]m untuk semua 1kn , dan kemunculan masing-masing nomor kecuali nomor tertentu dalam A[1..n] adalah angka ganjil. Coba cari nomor yang kemunculannya genap.

Ada algoritma : kita mengurutkan menjadi , dan memecah menjadi beberapa bagian, yang nilainya elemen adalah sama, oleh karena itu kita dapat menghitung terjadinya setiap elemen.Θ(nlogn)A[1..n]B[1..n]B[1..n]

Saya ingin mencari algoritma spasi -terburuk- -waktu-dan- .O(n)O(n)

Andaikan dan \ epsilon> 0 , maka jenis radix tidak dapat diterima. \ DeclareMathOperator {\ xor} {xor} Operasi bitwise biner dapat diterima, misalnya, A [1] \ xor A [2] .m=Ω(n1+ϵ)ϵ>0A[1]xorA[2]

Yai0Phah
sumber
Jawaban Aryabhata di bawah ini menunjukkan bahwa kasus umum tidak baik, tetapi mungkin Anda memiliki batasan lebih lanjut? Pembatasan sederhana (tapi besar) adalah untuk menegakkan bahwa semua entri dalam array berukuran HAI(n) . Ini akan memberikan algoritma linier yang cukup sepele.
Luke Mathies
1
@LukeMathieson: Saya menghapus jawaban itu, karena saya belum yakin bahwa makalah yang saya kutip akan bekerja tanpa modifikasi, dan selain itu, OP tampaknya hanya tertarik pada model RAM biaya seragam.
Aryabhata
@Aryabhata: hehe, well jawabannya tidak ada di sana! Karena tidak menarik, dan mungkin bermanfaat bagi Frank, menurut Anda apa masalahnya dengan mengadaptasi hasil di koran? Skim cepat menyarankan itu diterapkan, tapi saya jelas tidak membacanya.
Luke Mathies
@LukeMathieson: Fakta bahwa elemen-elemen lain harus muncul beberapa kali dalam masalah saat ini. Karena, saya juga membaca buktinya ...
Aryabhata
Akan menarik jika Anda tertarik pada hasil teoretis atau solusi praktis. Dari sudut pandang teori, tanggapan cepat pertama saya adalah, bahwa Anda dapat mengurutkan daftar bilangan bulat lebih cepat dari . Ada algoritma deterministik oleh Han yang berjalan dalam waktu . Untuk algoritma acak, hasil yang lebih baik diketahui, misalnya Han dan Thorup telah menemukan algoritma waktu yang diharapkan . Namun, saya pikir masalah Anda tidak perlu disortir. O ( log log n ) O ( n HAI(ncatatann)HAI(catatancatatann)HAI(ncatatancatatann)
A.Schulz

Jawaban:

2

Berikut ini ide untuk algoritma sederhana; hitung saja semua kemunculannya!

  1. Cari . - waktuΘ ( n )m=maksSEBUAHΘ(n)
  2. Array "Alokasikan" . - waktu ¹O ( 1 )C[0 ..m]HAI(1)
  3. Iterasi lebih dari dan tambah per satu setiap kali Anda menemukan . Jika adalah , add ke daftar linear . - waktuC [ x ] A [ _ ] = x C [ x ] 0 x L Θ ( n )SEBUAHC[x]SEBUAH[_]=xC[x]0xL.Θ(n)
  4. Iterate di atas dan temukan elemen dengan genap. - waktu .x e C [ x e ] O ( n )L.xeC[xe]HAI(n)
  5. Kembalikan .xe

Secara keseluruhan, ini memberi Anda algoritma linear-waktu yang dapat menggunakan (dalam arti mengalokasikan) banyak memori. Perhatikan bahwa dapat mengakses acak dalam waktu yang konstan tanpa tergantung pada sangat penting di sini.mCm

tambahan terikat pada ruang lebih sulit dengan pendekatan ini; Saya tidak tahu ada struktur data kamus yang menawarkan pencarian waktu. Anda dapat menggunakan tabel-hash yang di sini adalah implementasi dengan waktu pencarian yang diharapkan ( ukuran tabel, jumlah elemen yang disimpan) sehingga Anda bisa mendapatkan yang sewenang-wenang dengan ruang linear - dengan harapan. Jika semua nilai dalam peta ke nilai hash yang sama, Anda kacau.O ( 1 ) O ( 1 + k / n ) n k AHAI(n)HAI(1)HAI(1+k/n) nkSEBUAH


  1. Pada RAM, ini dilakukan secara implisit; yang kita butuhkan adalah posisi awal dan mungkin posisi akhir.
Raphael
sumber
0

Solusi yang hampir sepele - yang menggunakan ruang - adalah menggunakan peta hash. Ingat bahwa peta hash telah mengamortisasi runtime untuk menambah dan mencari elemen.O ( 1 )Θ(n)O(1)

Karenanya, kita dapat menggunakan algoritma berikut:

  1. Mengalokasikan peta hash . Iterate lebih . Untuk setiap elemen , tambah jumlah kejadian yang terlihat, yaitu .HAiAH(i)++

  2. Ulangi set kunci peta hash, dan periksa kunci mana yang memiliki jumlah kejadian genap.

Sekarang ini adalah algoritma sederhana yang tidak benar-benar menggunakan trik besar, tetapi kadang-kadang bahkan ini sudah cukup. Jika tidak, Anda mungkin ingin menentukan batasan ruang apa yang Anda tetapkan.

HdM
sumber
Saya masih ingin tahu, apakah ada algoritma waktu non-acak menggunakan ruang polinomial. Secara khusus, adakah bukti teoritis bahwa menemukan satu-satunya unsur yang terjadi lebih sulit daripada menemukan satu-satunya unsur yang terjadi aneh? HAI(n)
A.Schulz
@ A.Schulz Saya pikir itu adalah -tunggu-waktu algoritma dengan menggunakan tabel hash. Saya ingat bahwa seseorang mengatakan kepada saya sebuah -algoritma (atau untuk beberapa kasus khusus, katakanlah, odd = 1 dan bahkan = 2) mungkin dengan stack, tetapi saya tidak dapat mengingatnya. HAI(n)HAI(n)
Yai0Phah
Tidak setiap implementasi hashtable memiliki properti ini; biasanya, pencarian bukan , bahkan tidak diamortisasi (afaik). Bahkan, diskusi sebelumnya belum menghasilkan implementasi yang memiliki pencarian waktu konstan. Bisakah Anda lebih spesifik? HAI(1)
Raphael