Tôi có một danh sách N mục và tôi tự hỏi làm thế nào tôi có thể lặp qua danh sách để có được mọi kết hợp. Không có gấp đôi, vì vậy tôi cần phải có tất cả N! trật tự. Bộ nhớ thêm là không có vấn đề, tôi đang cố gắng để nghĩ về thuật toán đơn giản nhất nhưng tôi đang gặp rắc rối.Thuật toán C++ cho N! orderings
Trả lời
Cuộc gọi tốt (để nói). Mặc dù công bằng, OP đã yêu cầu * thuật toán * đơn giản nhất. –
C++ STL có next_permutation cho mục đích này.
Mở rộng trên câu trả lời của người khác, đây là một ví dụ về std :: next_permutation chuyển thể từ cplusplus.com
#include <iostream>
#include <algorithm>
using namespace std;
void outputArray(int* array, int size)
{
for (int i = 0; i < size; ++i) { cout << array[i] << " "; }
}
int main()
{
int myints[] = { 1, 2, 3, 4, 5 };
const int size = sizeof(myints);
cout << "The 5! possible permutations with 5 elements:\n";
sort (myints, myints + size);
bool hasMorePermutations = true;
do
{
outputArray(myints, size);
hasMorePermutations = next_permutation(myints, myints + size);
}
while (hasMorePermutations);
return 0;
}
+1 để cung cấp ví dụ. –
Có vẻ như không có bất kỳ điểm nào trong biến 'bool'. Bạn chỉ có thể 'làm {...} trong khi (std :: next_permutation (...));' –
@Charles: Đúng vậy, tôi có thể làm điều đó. Đối với mục đích giảng dạy, tôi đã rút ra next_permutation vì đó là trọng tâm của mã. – Bill
thuật toán đơn giản sử dụng Đệ quy:
giả
getPermutations(CurItemList , CurPermList)
if CurItemList.isempty()
return CurPermList
else
Permutations = {}
for i = 1 to CurItemList.size()
CurPermList.addLast(CurItemList.get(i))
NextItemList = CurItemList.copy()
NextItemList.remove(i)
Permutations.add(getPermutations(NextItemList, CurPermList))
CurPermList.removeLast()
return Permutations
// To make it look better
Permutations(ItemList)
return getPermutations(ItemList, {})
tôi didnt kiểm tra nó, nhưng nên làm việc. Có lẽ nó không phải là cách thông minh nhất để làm điều đó, nhưng nó là một cách dễ dàng. Nếu có điều gì sai, vui lòng cho tôi biết!
Thử xây dựng tập hợp các kết hợp đệ quy với số lượng cố định các thành phần có thể có. Tập hợp tất cả các kết hợp có thể sẽ là liên kết của tập hợp các kết hợp của 1 phần tử, 2 phần tử, ... tối đa N phần tử.
Sau đó, bạn có thể tấn công từng kết hợp có kích thước cố định riêng lẻ.
- 1. Kiến trúc MySQL cho n * (n - 1)/2 thuật toán
- 2. Thuật toán đối sánh n-chiều
- 3. Thuật toán C# Diff cho văn bản
- 4. Thuật toán trong C
- 5. Thuật toán khoảng cách Levenshtein tốt hơn O (n * m)?
- 6. Thuật toán lập trình động N, K problem
- 7. Thuật toán tfidf cho python
- 8. Thuật toán để giải quyết câu đố N Queens Domination
- 9. Thuật toán Sudoku trong C#
- 10. Thuật toán nhanh nhất để tính toán (a^(2^N))% m?
- 11. Thuật toán O (n) để tìm ra phần tử xuất hiện nhiều hơn n/2 lần
- 12. Tính toán (a * b) mod c nhanh chóng cho c = 2^N + -1
- 13. Thuật toán cho bitwise fiddling
- 14. thuật toán kết hợp
- 15. Thuật toán Triple DES trong C?
- 16. Ví dụ về các thuật toán có các phức tạp O (1), O (n log n) và O (log n)
- 17. Thuật toán LP Simplex trong C++
- 18. Mã giả cho thuật toán của Fortune
- 19. Thuật toán số nguyên tố
- 20. Thuật toán để tính toán chế độ
- 21. Dịch thuật toán C sang Python
- 22. Thuật toán URL Slugify trong C#?
- 23. C# so sánh các thuật toán
- 24. Tối ưu hóa C# thuật toán này (K Difference)
- 25. Kỹ thuật cho đồ họa động (thuật toán)
- 26. Thuật toán số Chuông
- 27. Thuật toán xếp hạng
- 28. Tính toán gốc thứ n?
- 29. Thuật toán C/C++: Cách nhanh nhất để tính toán (2^n)% d với một và d 32 hoặc 64 bit số nguyên
- 30. Thuật toán nén tốt nhất cho XML?
là sự kết hợp hoặc hoán vị? – sud03r
Xem thêm giải thích về hai thuật toán khác nhau tại http://stackoverflow.com/questions/352203/generating-permutations-lazily/ – ShreevatsaR