Misalkan saya mengingat tetap lebar bilangan bulat (yaitu mereka cocok dalam register lebar w ), seorang 1 , sebuah 2 , ... sebuah n sehingga jumlah mereka yang 1 + a 2 + ⋯ + a n = S juga cocok dalam register dengan lebar w .
Sepertinya saya bahwa kita selalu dapat mengubah angka ke sehingga setiap jumlah awalan S i = b 1 + b 2 + ⋯ + b saya juga cocok dalam register lebar w .
Pada dasarnya, motivasinya adalah untuk menghitung jumlah pada mesin register lebar tetap tanpa harus khawatir tentang bilangan bulat bilangan bulat pada setiap tahap menengah.
Apakah ada algoritma yang cepat (lebih disukai waktu linier) untuk menemukan permutasi seperti itu (dengan asumsi diberikan sebagai array input)? (atau katakan jika permutasi seperti itu tidak ada).
sumber
-2^(n-1)
hingga2^(n-1)-1
. Tentu saja membutuhkan komplemen dua dan perilaku overflow yang terdefinisi dengan baik, tetapi dalam bahasa seperti C # itu harus bekerja.Jawaban:
Strategi0
Algoritma linear-waktu berikut mengadopsi strategi melayang di sekitar , dengan memilih angka positif atau negatif berdasarkan tanda jumlah parsial. Ini memproses daftar angka; itu menghitung permutasi dari input on-the-fly , sambil melakukan penambahan.
Algoritma
Correctness
Correctness dapat dibangun dengan menggunakan argumen induktif langsung pada panjang daftar angka.
Pertama, buktikan bahwa jika semuanya positif (atau semuanya negatif), dan jumlahnya tidak menyebabkan overflow, maka jumlah awalan juga tidak. Ini mudah.a1,…,an
Kedua, buktikan bahwa berada dalam batas adalah invarian dari loop algoritma. Jelas, ini benar saat masuk ke loop, karena S u m = 0 . Sekarang, jika S u m > 0 , menambahkan angka negatif yang berada dalam batas ke S u m tidak menyebabkan S u m keluar dari batas. Demikian pula, ketika S u m ≤ 0 menambahkan angka positif yang ada di dalam batas-batas untuk jumlah tidak menyebabkan S u m untuk pergi keluar batas. Jadi saat keluar dari loop,Sum Sum=0 Sum>0 Sum Sum Sum≤0 Sum Sum
Sekarang, hasil pertama dapat diterapkan, dan bersama-sama ini cukup untuk membuktikan bahwa jumlah tidak pernah keluar batas.
sumber