算法
常见经典算法理论学习,主要梳理学习过的算法
fighting&code
big data
展开
-
c++ STL容器常用法
vector 变长数组,倍增思想size()empty()clear() 清空front()/back() 最前一个数 最后一个数push_back() /pop_back()begin() / end()支持比较运算pair<int,int>pair<int,string> p; 结构体 p.first 第一个元素 p.second 第二个元素 支持比较远算,以first为第一关键字,以sceond为第二原创 2021-04-15 19:39:59 · 101 阅读 · 1 评论 -
算法设计与分析学习笔记(6)——排列树与子集树
常见的解空间结构1.子集树概述:子集树是使用回溯法解题时经常遇到的一种典型的解空间树。当所给的问题是从n个元素组成的集合S中找出满足某种性质的一个子集时,相应的解空间树称为子集树。此类问题解的形式为n元组(x1,x2…xn),分量xi(1,2,…n)表示第i个元素是否在要找的子集中。xi的取值为0或者1,xi=0 表示第i个元素不在要找的子集中;xi=1 表示第i个元素在要找的子集中。树的根结点:初始状态中间结点:某种情况下的中间状态叶子结点:结束状态分支:从一个状态过渡到另一个状态的行为从原创 2021-04-14 11:34:50 · 6912 阅读 · 1 评论 -
算法设计与分析笔记(5)---排列数字
题目要求:给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。输出所有的排列方法。题目分析:利用递归深搜,一种解空间是基于排列树,一种是直接进行dfs暴力。.-----------还有c++的STL容器有一个函数 next_permutation:求下一个排列组合a.函数模板:next_permutation(arr, arr+size);b.参数说明: arr: 数组名 size:数组元素个数c.函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返原创 2021-04-13 13:56:13 · 201 阅读 · 1 评论 -
算法设计与分析学习笔记(4)-分治算法
算法理解:分治算法一般的求解过程可以分为三个步骤:分解、求解、合并分解:原问题可以分解为多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。求解:对划分好的子问题进行求解:原问题在分解过程中,递归地求解子问题由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。合并:应能够采用某种方式、方法合并或构造出原问题的解。在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中原创 2021-04-11 13:21:26 · 577 阅读 · 1 评论 -
算法设计与分析学习笔记(3)贪心算法
贪心思想:贪心算法要求不从全局看待问题,先从当前子问题找点最优解,那么如果子问题都是最优的选择,一定能找到全局最优的结果。因此贪心算法可以很有用,贪心算法既是很容易理解的算法,又是不容易理解的算法,因为贪心策略的选择因人而异。贪心算法讲究的是当前子问题的最优解,所以寻找贪心算法的最优策略时就要有“走一步,看一步”这样的心理状态,如果能找到子问题的最优解,那么再从全局观察,加以简单的证明,那么就可以确认选择了最优的策略,那么我们就可以去使用这种策略去解决问题了。重难点:题目是否可以使用贪心法去考虑,如果使原创 2021-04-11 13:07:33 · 236 阅读 · 0 评论 -
算法设计与分析学习笔记(2)n皇后问题-dfs回溯
。。。原创 2021-04-11 12:52:50 · 258 阅读 · 0 评论 -
合并排序
合并排序:1):先是将序列按照二分划分为两个子序列;2):将两个子序列递归排序;3):将排好序的两个子序列进行合并;(python版本)#合并排序def merge(arr,l,r,mid): n1=mid+1-l n2=r-mid L=arr[l:mid+1] R=arr[mid+1:r+1] i=0 j=0 k=l while i<n1 and j<n2: if L[i]<R[j]:原创 2021-03-19 13:32:41 · 82 阅读 · 0 评论 -
快速排序
快速排序:1):选择一个基准,基准的选择可以是任意的,但是一旦选择好了,就要一直按照这种选择来选择标记;2):将大于基准的放在右边,小于基准的放在左边;3):递归左右两个子序列,也就是在左右两个子序列中再按照这样的方式进行划分序列,直到不能划分为止(也就是左右两个序列都完成的递归排序)(python版本)#快排def quick_sort(arr,l,r): if l>=r: return i=l-1 j=r+1 x=arr[l+r>原创 2021-03-19 13:25:56 · 67 阅读 · 0 评论 -
前缀和 差分
前缀和:通常使用前缀和来解决这样的问题,给定一组数组,给定两个数l,r,让求这个数组里面从[l,r]里的数的和,可能你说遍历也能解决,但是当数据量很大时,就会直接TLE,于是这时候我们的前缀和就派上用场了,使用前缀和我们可以将时间复杂度缩短至O(m+n),接下来是求前缀和的过程:ans=b[r]-b[l-1]#include<iostream>#include<algorithm>using namespace std;const int N=1e6+9;int a[N]原创 2021-02-08 13:17:55 · 85 阅读 · 0 评论