- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建来自 đây 的代码.我想生成一个集合的所有排列,例如(取自线程):
Collection: 1, 2, 3
Permutations: {1, 2, 3}
{1, 3, 2}
{2, 1, 3}
{2, 3, 1}
{3, 1, 2}
{3, 2, 1}
có每个集合的可能排列,但这不是我想要实现的。考虑以下集合:
这将产生 排列,极端数量
.这将花费非常长的时间来计算,因为每个零都被认为是唯一的。
除此之外,我只想生成不同的排列。如果我们这样做,只有
排列 remaining , 因为有 18 个项目是相同的 (k)。
现在,我可以运行上述线程中的代码并将结果存储在 HashSet 中,从而消除重复排列。然而,那将是极其低效的。我正在寻找一种算法来直接生成有区别的排列。
câu trả lời hay nhất
使用Swap算法寻找排列可以直接排除产生重复排列的部分。该算法可在 Internet 上找到,您可以找到有关它的更多信息。
private static void Main(string[] args)
{
List set = new List
{
20, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
var permutes = Permute(set);
Console.WriteLine(permutes.Count); // outputs 58140
}
private static List Permute(List set)
{
List result = new List();
Action permute = null;
permute = start =>
{
if (start == set.Count)
{
result.Add(set.ToArray());
}
khác
{
List swaps = new List();
for (int i = start; i < set.Count; i++)
{
if (swaps.Contains(set[i])) continue; // skip if we already done swap with this item
swaps.Add(set[i]);
Swap(set, start, i);
permute(start + 1);
Swap(set, start, i);
}
}
};
permute(0);
trả về kết quả;
}
private static void Swap(List set, int index1, int index2)
{
int temp = set[index1];
set[index1] = set[index2];
set[index2] = temp;
}
下图展示了交换算法的工作原理。
所以你有 {A,B,C}, {A,C,B}, {B,A,C}, {B,C,A}, {C,B,A}, { C,A,B}
现在考虑 MỘT
Và B
相等。我用 photoshop 编辑了图像(对不起,如果我不擅长它!)并将 B
Thay thế bằng MỘT
。如图所示
我发现了图像中的重复项。如果你跳过它们,你将得到 {A,A,C}, {A,C,A}, {C,A,A}
你必须存储交换的项目,所以如果项目相等并且我们已经进行了交换,我们就跳过以防止重复
if (swaps.Contains(set[i])) continue; // skip if we already done swap with this item
swaps.Add(set[i]); // else add it to the list of swaps.
为了测试如果你删除这部分那么这个算法会产生重复的排列并且控制台会输出n!
。
关于c# - 生成集合的排列 - 高效且有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329184/
Tôi cần tạo hoán vị trên một danh sách nhất định. Tôi đã làm được điều này let rec Permute (final, arr) = if List.length arr > 0 then for xi
Tôi đang cố chạy mã của mình để nó in các hoán vị lặp, mặc dù hiện tại tôi chỉ có thể làm cho nó thực hiện hoán vị đầu tiên. Nó chạy chính xác đến điểm tôi đã đánh dấu, nhưng tôi không thể thấy có gì sai. Tôi nghĩ rằng không có dấu ngắt trong vòng lặp while, nhưng tôi không chắc chắn. Thực sự cần sự giúp đỡ. nhịp độ
Tôi đang cố đếm số hoán vị không chứa các chữ cái liên tiếp. Mã của tôi vượt qua các bài kiểm tra như "aabb" (câu trả lời: 8) và "aab" (câu trả lời: 2), nhưng không thành công trong các trường hợp như "abcdefa" (câu trả lời của tôi: 2520; câu trả lời đúng: 3600). cái này
Trò chơi nằm trong B. Lời nói đầu hoán vị: dp trên cây Descartes? Tên này thật tuyệt vời, nhưng nó thực sự không yêu cầu cây Descartes. Nó chỉ sử dụng định nghĩa của cây Descartes: chúng ta đặt vị trí của giá trị lớn nhất trong một khoảng \([l,r]\) thành \(pos\ ),
Tôi đang cố gắng sử dụng tính năng sắp xếp của dplyr để sắp xếp các chuỗi dựa trên một điều kiện. Tôi muốn sắp xếp trên một cột, nhưng theo thứ tự tăng dần nếu cột thứ hai bằng một giá trị và theo thứ tự giảm dần nếu cột thứ hai bằng một giá trị khác. Tôi tìm thấy một số câu hỏi tương tự (một trong số đó
Trong R, tôi đang sử dụng dplyr cụ thể hơn là sắp xếp(). Bằng cách nào đó, chức năng sắp xếp không hoạt động như mong đợi. Trong ví dụ bên dưới, trước tiên tôi lưu tên của cột rồi chuyển biến này làm tham số cho hàm có tên "my_functio
Sau đây là main.qml của tôi: Window { id: windowvisible: true width: 800 Height: 480 tiêu đề:
Thật khó để google câu hỏi này vì tôi không chắc những khái niệm này được gọi là gì và tất cả các bài đăng "sự kết hợp của hai mảng/nhóm" SO không mang lại cho tôi kết quả như mong đợi. Ví dụ về mảng: var array1 = ['Bob', 'Tina'];
Cách tốt nhất để đạt được các mục tiêu sau đây là gì? Tôi có hai danh sách: val l1 = List("a", "b") val l2 = List(1, 2) Tôi muốn tạo danh sách này: List ( List(('a', 1)
Tôi biết có rất nhiều giải pháp cho vấn đề cụ thể của mình trên Internet, nhưng tôi đã cố gắng giải quyết theo một cách cụ thể nhưng không hiệu quả và tôi thực sự không hiểu chuyện gì đang xảy ra. Trong trường hợp của tôi, tôi chỉ muốn in sự sắp xếp. Đây là mã của tôi: a = "abc";
Tôi có mã này để tạo hoán vị: --unique hoán vị perm :: [t] -> [[t]] perm [] = [[]] perm (x:xs) = [(y:zs) (y , vâng
Có cách nào tốt hơn việc sử dụng công thức cơ bản n!/(nr)!? Giống như chúng ta làm với nCr (tổ hợp) nCr = (nl)Cr + (n-1)C(r-1)? Còn câu trả lời đúng nhất thì sao: nPr = (n−1)Pr +
Câu hỏi và trả lời này được thúc đẩy bởi Cách xây dựng hoán vị với một số điều kiện trong R. Cho đến nay có một số gói R tốt như RcppAlgos và arr
Tôi đang sửa lại một ví dụ sắp xếp từ một cuốn sách. Đoạn mã sau hoạt động như mong đợi. perms([]) -> [[]]; perms(L) -> [[H|T] |H []; Khi tôi thay thế, tôi nhận được điều này.
Khoảng một tuần trước, tôi đã hỏi một câu hỏi về hoán vị Java sẽ giúp tôi giải quyết vấn đề này, gặp vấn đề với phương pháp hoán vị in. Tôi đã sắp xếp lại mã của mình và có một ví dụ hoạt động hiện đang hoạt động, mặc dù nếu 5 ở vị trí thứ năm trong mảng
Tôi có một danh sách có các phần tử lặp lại, tức là orig = [1,1,1,2,2,3]. Tôi muốn tạo một sự xáo trộn b = f(orig) sao cho mọi giá trị vị trí trong b khác với giá trị trong orig: b[i] !
Tôi muốn tạo một hoán vị của một mảng a và tôi không muốn sử dụng các hàm tiện ích như java.util.Collections() . Các hoán vị phải là ngẫu nhiên và mọi hoán vị đều có thể thực hiện được - nhưng điều đó không cần thiết. là xác suất phân bố đều. những điều sau đây
Tôi có một bài tập: người dùng nhập một chuỗi, chẳng hạn như ABCD, và chương trình phải đưa ra tất cả các hoán vị. Tôi không muốn toàn bộ mã chỉ là một gợi ý. Đây là những gì tôi đã có với họ cho đến nay, tôi chưa nhận được bất kỳ triển khai nào. Lấy ABCD làm ví dụ: Trong ví dụ này lấy độ dài của chuỗi
Tôi hiện đang viết chương trình bằng itertools và một phần của chương trình có vẻ không hoạt động bình thường. Tôi muốn đầu vào xác định độ dài của danh sách đầu ra của hàm hoán vị bằng với độ dài của danh sách mà nó tạo ra đầu ra. Nói cách khác, tôi đã import itertools b =
Tôi có một danh sách x=[1,2,3,4,5] và muốn xem các hoán vị khác nhau của danh sách này, lấy hai số cùng một lúc. x=[1,2,3,4,5] từ itertools nhập hoán vị y=list
Tôi là một lập trình viên xuất sắc, rất giỏi!