Saya akan menambahkan satu hal kecil ke jawaban DW:
Saya telah melihat orang-orang yang berpikir bahwa karena Knapsack unary dalam P maka kita dapat menggunakannya di tempat Knapsack yang algoritma saat ini terbaik memiliki waktu yang eksponensial.
Biarkan input menjadi dan k dan pertimbangkan algoritma pemrograman dinamis untuk Knapsack dan Knapsack unary. Waktu berjalan bagi mereka berdua adalah O ( n k ) . Ini adalah waktu berjalan yang sama. Yaitu jika Anda memiliki input, tidak masalah jika Anda menggunakan pemrograman dinamis untuk Knapsack unary atau pemrograman dinamis untuk Knapsack. Keduanya akan mengambil (kira-kira) jumlah waktu yang sama untuk menyelesaikan contoh masalah. Secara teoritis di mana saja Anda menggunakan yang Anda dapat menggunakan yang lain juga. Anda hanya perlu mengonversi angka dari unary ke binary dan sebaliknya.W={w1,…,wn}kO(nk)
Jadi apa gunanya mendefinisikan kompleksitas algoritma wrt dengan ukuran input? Mengapa tidak selalu menyatakan mereka dalam hal parameter sebagai ?O(nk)
Jika Anda peduli tentang masalah dalam isolasi Anda dapat melakukannya. Sebenarnya itulah yang sering dilakukan orang dalam algoritma. Kompleksitas algoritma grafik sering dinyatakan dalam hal jumlah simpul dan jumlah tepi, bukan ukuran string yang mengkodekannya.
Tapi ini hanya ketika kita berurusan dengan masalah yang terisolasi. Ini tidak berguna ketika kita berurusan dengan masalah dengan berbagai jenis input. Untuk grafik kita dapat berbicara tentang menjalankan waktu wrt ke jumlah simpul dan tepi. Untuk Knapsack kita dapat berbicara tentang jumlah item dan ukuran Knapsack. Tetapi bagaimana jika kita ingin membicarakan keduanya? Misalnya ketika kita ingin reduksi antar masalah, atau mendiskusikan kelas masalah yang mencakup masalah arbitrer, bukan hanya masalah dengan grafik sebagai input. Kami membutuhkan parameter input universal. Input secara umum hanyalah string, kitalah yang menafsirkan simbolnya sebagai angka unary, angka biner, grafik, dll. Untuk mengembangkan teori umum kompleksitas algoritme dan masalah, kita memerlukan parameter input umum. Ukuran input adalah pilihan yang jelas dan ternyata cukup kuat sehingga kita dapat membangun teori yang masuk akal di atasnya. Itu bukan satu-satunya kemungkinan. Untuk yang artifisial kita dapat membangun teori berdasarkan dengan ukuran input. Ini akan bekerja dengan baik.2
Sekarang kita memutuskan untuk menggunakan ukuran sebagai parameter universal input kita memaksa untuk berpikir tentang pengkodean objek dalam hal string. Ada berbagai cara untuk menyandikannya dan ukurannya bisa berbeda. (Mereka juga membuat hal-hal yang berbeda mudah / sulit.) Dalam hal teori umum algoritma, apakah kita menyandikan nomor input dalam unary atau binary menjadi penting. Jika kita menggunakan unary dan ukuran adalah 100 , jumlah terbesar yang akan kita dapatkan adalah 100 . Jika kita menggunakan biner k bisa sebesar 2 100 - 1 . Jadi ketika kita berbicara tentang waktu berjalan menyelesaikan masalah Knapsack di mana ukuran kk100100k2100−1kk2100−1
nnp(n)kp(n)k2p(n)−1kk
nk