Saya punya c++ vector
dengan std::pair<unsigned long, unsigned long>
objek. Saya mencoba untuk menghasilkan permutasi objek menggunakan vektor std::next_permutation()
. Namun, saya ingin permutasi dari ukuran yang diberikan, Anda tahu, mirip dengan permutations
fungsi di python di mana ukuran permutasi yang diharapkan ditentukan.
Pada dasarnya c++
setara dengan
import itertools
list = [1,2,3,4,5,6,7]
for permutation in itertools.permutations(list, 3):
print(permutation)
(1, 2, 3)
(1, 2, 4)
(1, 2, 5)
(1, 2, 6)
(1, 2, 7)
(1, 3, 2)
(1, 3, 4)
..
(7, 5, 4)
(7, 5, 6)
(7, 6, 1)
(7, 6, 2)
(7, 6, 3)
(7, 6, 4)
(7, 6, 5)
python
c++
permutation
d4rk4ng31
sumber
sumber
(1, 1)
? permutasi python menyediakan duplikat[(1, 1), (1, 1)]
, sedangkanstd::next_permutation
menghindari duplikat (hanya{1, 1}
).Jawaban:
Anda mungkin menggunakan 2 loop:
Demo
sumber
std::next_permutation
"tidak jelas" karena ia menghitung swap (Linear). Ekstraksi sub vektor dapat ditingkatkan, tetapi saya tidak berpikir itu mengubah kompleksitas. Selain itu jumlah permutasi tergantung dari ukuran vektor, sehingga 2 parameter tidak independen.std::vector<T>& v
?v
saat ini). Saya mungkin melewati referensi const, dan membuat salinan diurutkan sebagai gantinya.Jika efisiensi bukanlah perhatian utama, kami dapat mengulangi semua permutasi dan melompati permutasi yang berbeda pada akhiran memilih hanya masing-masing
(N - k)!
. Misalnya, untukN = 4, k = 2
, kami memiliki permutasi:di mana saya memasukkan ruang untuk kejelasan dan menandai
(N-k)! = 2! = 2
permutasi masing-masing<
.Keluaran:
sumber
Berikut ini adalah algoritma yang efisien yang tidak menggunakan
std::next_permutation
secara langsung, tetapi memanfaatkan kuda kerja dari fungsi itu. Yaitu,std::swap
danstd::reverse
. Sebagai nilai tambah, ini dalam urutan leksikografis .Dan kami menyebutnya:
Berikut hasilnya:
Ini adalah kode runnable dari ideone
sumber
bool nextPartialPermutation(It begin, It mid, It end)
Mengubah jawaban Joseph Wood dengan antarmuka iterator, Anda mungkin memiliki metode yang mirip dengan
std::next_permutation
:Demo
sumber
Ini solusi saya setelah beberapa pemikiran
Silakan komentar pikiran Anda
sumber
permute
sebenarnya hanya bisaset.insert(vec);
menghilangkan faktor besar.O(nb_total_perm * log(nb_res))
(nb_total_perm
yang sebagian besarfactorial(job_list.size())
dannb_res
ukuran hasil:)permutations.size()
, Jadi masih terlalu besar. (tapi sekarang Anda menangani input duplikat yang bertentangan dengan Evg)