排列組合算法:解鎖數據世界的魔法鑰匙

在 C++ 算法的奇幻世界里,排列和組合算法就像是兩把神奇的魔法鑰匙,能夠幫我們解鎖數據世界中各種復雜問題的大門。今天,作為 C++ 算法小白的我,就帶大家一起走進排列和組合算法的奇妙天地。

排列算法:創造所有可能的順序

什么是排列?

排列是指從給定的元素集合中取出若干元素,按照一定的順序進行排列,不同的順序視為不同的排列。比如,從?{1, 2, 3}?中取出 3 個元素進行排列,就有?123132213231312321?這 6 種不同的排列方式。

代碼實現:使用遞歸生成全排列

cpp

#include <iostream>
#include <vector>// 交換兩個元素的函數
void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}// 遞歸生成全排列的函數
void permute(std::vector<int>& nums, int start, std::vector<std::vector<int>>& result) {if (start == nums.size()) {result.push_back(nums);return;}for (int i = start; i < nums.size(); ++i) {swap(nums[start], nums[i]);permute(nums, start + 1, result);swap(nums[start], nums[i]); // 回溯}
}// 生成全排列的主函數
std::vector<std::vector<int>> generatePermutations(std::vector<int>& nums) {std::vector<std::vector<int>> result;permute(nums, 0, result);return result;
}

詳細解釋

  • swap?函數:用于交換兩個元素的位置,這是排列過程中交換元素順序的基礎操作。
  • permute?函數:是核心的遞歸函數。當?start?等于數組的大小時,說明已經完成了一種排列,將其添加到結果中。否則,從?start?位置開始,依次與后面的元素交換位置,然后遞歸調用?permute?函數處理下一個位置,最后再交換回來(回溯),以便嘗試其他可能的排列。
  • generatePermutations?函數:初始化結果向量,并調用?permute?函數開始生成全排列。

例題講解

假設有數組?{1, 2, 3},調用?generatePermutations?函數后,會生成上述的 6 種不同排列。在實際應用中,排列算法可以用于解決密碼破解、游戲中的關卡布局等問題。

組合算法:選取元素的不同組合

什么是組合?

組合是指從給定的元素集合中取出若干元素,不考慮元素的順序,只要元素相同就視為同一種組合。比如,從?{1, 2, 3}?中取出 2 個元素的組合有?{1, 2}{1, 3}{2, 3}?這 3 種。

代碼實現:使用遞歸生成組合

cpp

#include <iostream>
#include <vector>// 遞歸生成組合的函數
void combine(std::vector<int>& nums, int start, int k, std::vector<int>& current, std::vector<std::vector<int>>& result) {if (current.size() == k) {result.push_back(current);return;}for (int i = start; i < nums.size(); ++i) {current.push_back(nums[i]);combine(nums, i + 1, k, current, result);current.pop_back(); // 回溯}
}// 生成組合的主函數
std::vector<std::vector<int>> generateCombinations(std::vector<int>& nums, int k) {std::vector<std::vector<int>> result;std::vector<int> current;combine(nums, 0, k, current, result);return result;
}

詳細解釋

  • combine?函數:是核心的遞歸函數。當當前組合的大小等于?k?時,說明已經完成了一種組合,將其添加到結果中。否則,從?start?位置開始,依次將元素添加到當前組合中,然后遞歸調用?combine?函數處理下一個位置,最后將元素從當前組合中移除(回溯),以便嘗試其他可能的組合。
  • generateCombinations?函數:初始化結果向量和當前組合向量,并調用?combine?函數開始生成組合。

例題講解

假設有數組?{1, 2, 3},調用?generateCombinations?函數,當?k = 2?時,會生成?{1, 2}{1, 3}{2, 3}?這 3 種組合。組合算法在實際應用中可用于解決組合優化、數據分析等問題。

總結

排列和組合算法在計算機科學中有著廣泛的應用,無論是在游戲開發、密碼學、數據分析還是其他領域,都能發揮重要作用。通過遞歸的方式,我們可以簡潔地實現這兩種算法。作為 C++ 算法小白,我們要不斷學習和實踐,掌握這些算法的精髓,用它們來解決更多有趣的問題。

希望大家通過這篇文章對排列和組合算法有了更深入的了解,讓我們一起在算法的世界里繼續探索吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80010.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入探討 UDP 協議與多線程 HTTP 服務器

深入探討 UDP 協議與多線程 HTTP 服務器 一、UDP 協議&#xff1a;高效但“不羈”的傳輸使者 UDP 協議以其獨特的特性在網絡傳輸中占據一席之地&#xff0c;適用于對實時性要求高、能容忍少量數據丟失的場景。 1. UDP 的特點解析 無連接&#xff1a;無需提前建立連接&…

引用第三方自定義組件——微信小程序學習筆記

1. 使用 npm 安裝第三方包 1.1 下載安裝Node.js 工具 下載地址&#xff1a;Node.js — Download Node.js 1.2 安裝 npm 包 在項目空白處右鍵彈出菜單&#xff0c;選擇“在外部終端窗口打開”&#xff0c;打開命令行工具&#xff0c;輸入以下指令&#xff1a; 1> 初始化:…

數字化轉型是往哪轉?怎么轉?

寫在前面 當下數字化轉型的風還在吹&#xff0c;企業數字化轉型過程中以數字化項目滿足業務化需求&#xff0c;已有相關數字化平臺的話&#xff0c;就搞大平臺、大系統&#xff0c;解決數據孤島。政府數字化轉型亦是如此&#xff0c;某些省市發了系統優化整合的文&#xff0c;旨…

嵌入式學習--江協51單片機day2

今天學的不多&#xff0c;內容為&#xff1a;靜態、動態數碼管的控制&#xff0c;模塊化編程和lcd1602調試工具 數碼管的控制 由于內部電路的設計&#xff0c;數碼管每次只能顯示一個位置的一個數字&#xff0c;動態的實現是基于不同位置的閃爍頻率高。 P2_4,P2_3,P2_2控制位…

《數據結構:二叉搜索樹(Binary Search Tree)》

文章目錄 :red_circle:一、二叉搜索樹的概念:red_circle:二、二叉搜索樹的性能分析:red_circle:三、二叉搜索樹的操作&#xff08;一&#xff09;插入&#xff08;二&#xff09;查找&#xff08;三&#xff09;刪除 :red_circle:四、二叉搜索樹的實現代碼&#xff08;一&#…

【Linux相關】實時查看Nvidia-smi使用情況

【Linux相關】 實時查看Nvidia-smi使用情況 文章目錄 實時查看Nvidia-smi使用情況 實時查看Nvidia-smi使用情況 在本地終端執行下述語句 watch -n 1 nvidia-smi每一秒都會更新&#xff0c;將 1 改為其他數字可以滿足不同需求

Kotlin密封類優化Android狀態管理

Kotlin 的密封類&#xff08;Sealed Class&#xff09;確實是 Android 開發中管理復雜 UI 狀態的利器。它通過類型安全的層次結構&#xff0c;讓狀態管理代碼更加清晰簡潔。讓我們從實際開發場景出發&#xff0c;深入探討其應用&#xff1a; 一、密封類核心優勢 受限的類繼承…

JavaWeb:SpringBootWeb快速入門

介紹 Spring SpringBoot 入門程序 需求 步驟 修改端口 1.新建application.yml #設置端口 server:port: 8081入門程序-分析 為什么main方法能啟動web應用-內嵌tomcat 為什么tomcat能定位HelloController程序 請求先到DisPatcherServlet&#xff0c;根據路徑轉發 小結 1.…

Unity學習筆記二

文章目錄 3D數學公共計算結構體Mathf常用成員三角函數 向量Vector3基本成員點乘叉乘插值運算 四元數引出基本概念Quaternion結構體成員四元數運算 更多的Mono延遲函數協同程序多線程相關協程概念辨析協程本體協程調度器 Resources資源動態加載特殊文件夾Resources同步加載Resou…

為什么Transformer推理需要做KV緩存

一、我們先來回憶一下在transformer中KV在哪里出現過&#xff0c;都有什么作用&#xff1f; α的計算過程&#xff1a; 這里引入三個向量&#xff1a; 圖中的q為Query&#xff0c;用來匹配key值 圖中的k為key,用來被Query匹配 圖中的Value&#xff0c;是用來被進行加權平均的 由…

【大模型面試】大模型(LLMs)高頻面題全面整理(★2025年5月最新版★)

【大模型面試】大模型&#xff08;LLMs&#xff09;高頻面題全面整理&#xff08;★2025年5月最新版★&#xff09; &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺頭深草里&#xff0c;而今漸覺出蓬蒿。 本筆記適合大模型初學者和…

JAVA:使用 iTextPDF 處理 PDF 的技術詳解

1、簡述 iTextPDF 是一個功能強大的 Java PDF 庫,可以用來創建、修改和處理 PDF 文檔。通過它,我們可以完成如生成 PDF、讀取 PDF 內容、添加水印、合并 PDF 等多種操作。本篇博客將詳細介紹 iTextPDF 的使用方法,并提供一些實踐樣例,幫助開發者快速上手。 樣例代碼: htt…

模態與非模態窗口及使用時的數據交互

模態窗口使用exec()方法顯示&#xff0c;會阻塞父窗口&#xff0c;直到對話框關閉&#xff1b; 非模態對話框允許同時操作主窗口和設置窗口&#xff0c;使用show()。 模態和非模態的主要區別在于用戶能否與父窗口交互&#xff0c;非模態更適合需要頻繁切換的場景。非模態窗口需…

Docker進入MySQL之后如何用sql文件初始化數據

關閉Docker-compose.yml里面所有容器 docker compose -f docker_compose.yml down后臺形式開啟Docker-compose.yml所有容器 docker compose -f docker_compose.yml up -d羅列出所有啟動過的&#xff08;包括退出過的&#xff09;容器 docker ps -a進入指定容器ID內部 docke…

MAC 地址

MAC地址&#xff08;Media Access Control Address&#xff09;是指網絡設備在數據鏈路層使用的唯一標識符&#xff0c;也稱為硬件地址或物理地址。它用于標識設備之間的網絡通信&#xff0c;是網絡適配器&#xff08;如網卡、Wi-Fi適配器等&#xff09;的唯一標識。每個網絡設…

Redis 7.0中5種新特性及實戰應用

Redis 7.0引入了多項革命性的新特性&#xff0c;不僅在性能和可靠性方面有所提升&#xff0c;更在功能和使用體驗上有了質的飛躍。本文將介紹Redis 7.0的五大關鍵新特性&#xff0c;可以根據實際情況利用Redis 7.0的強大功能&#xff0c;構建更高效、更可靠的應用系統。 特性一…

PHP實現PDF自動簽名

技術要點&#xff1a;在PDF中找到一個固定錨點&#xff0c;在需要放置圖片的地方找到測試出錨點對應的XY位 // 使用了poppler方法&#xff0c;其他PDF庫在獲取坐標方面有各種問題&#xff0c;他的安裝是在Linux底層&#xff0c;比在PHP項目中用Composer安裝的庫看上去更穩定&a…

中達瑞和便攜式高光譜相機:珠寶鑒定領域的“光譜之眼”

在珠寶行業中&#xff0c;真偽鑒定始終是核心需求。隨著合成技術與優化處理手段的日益精進&#xff0c;傳統鑒定方法逐漸面臨挑戰。中達瑞和推出的便攜式高光譜相機&#xff0c;憑借其獨特的“圖譜合一”技術&#xff0c;為珠寶真假鑒定提供了科學、高效且無損的解決方案&#…

2025年滲透測試面試題總結-某戰隊紅隊實習面經(附回答)(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 某戰隊紅隊實習面經 個人經歷與技術能力 2. HVV/攻防演練成績 3. 上一個工作主要內容 4. 有意思的邏…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】5.1 描述性統計分析(均值/方差/分位數計算)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 5.1 描述性統計分析&#xff1a;均值、方差與分位數計算實戰5.1.1 數據準備與分析目標數據集介紹分析目標 5.1.2 均值計算&#xff1a;從整體到分組分析總體均值計算加權均值…