减治法和分治法和贪心算法和动态规划和一些算法概念

分治法是把一个问题分成多个小问题解决,
减治法是把一个问题化成一个小问题解决。

分治法的经典算法是归并排序。
归并排序:先使每个子序列有序,再合并子序列。
减治法的经典算法是约瑟夫问题。

分治法是把一个大问题划分为若干个子问题,分别求解各个子问题,然后再把子问题的解进行合并得到原问题的解。
减治法是把一个大问题划分为若干个子问题,只需求解一个子问题。

贪心算法总是做出在当前看来是最好的选择。总是局部最优选择。这种局部最优选择并不总能获得整体最优解。

动态规划是多阶段决策最优解。自底向上的方式来递推。

堆排序
堆是一种数据结构。是一颗完全二叉树。
大根堆,根节点比左右子树都大。
小根堆,根节点比左右子树都小。

堆排序:1.构建堆。 2.输出堆顶元素。3.调整堆。

动态规划是自底向上求解,求解过程依赖于子问题的解,在求出先关子问题的解后,再做出选择。
贪心方法是自顶向下求解,求解过程不依赖于子问题的解,仅在当前状态下做出做好选择。

回溯算法也是穷举。剪枝:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了。

回溯法实际上是一个类似穷举的搜索尝试过程。主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”,尝试别的路径。

回溯两类问题:1.存在性问题(可行解)2.优化问题(最优解)
以深度优先的方式系统地搜索问题的解的算法称为回溯法。
快速排序使用减治策略。

程序等于算法加数据结构。
算法的概念
可以有输入 必须有输出 有穷性 确定性 可行性

选择排序:属于蛮力法
for(int i=0;i<n;i++)
{
index=i;#从第一个元素开始找起走
for(int j=i+1;j<n;j++)
{
if(r[j]<r[index]) #找到最小值的下标
index=j; #将最小值的下标赋给index
if(index!=i) #i为当前第一个元素下标 index为当前最小值元素下标
{
temp=index; #将最小值和当前序列的第一个元素交换位置
index=i;
i=temp;
}
}
}
冒泡排序:蛮力法
for(int i=0;i<n;i++)#第几趟
for(int j=0;j<n-i+1;j++)#第几趟中剩余的元素
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
顺序查找 蛮力法
0 1背包问题 要么放进去 要么不放进去。
背包问题 可以放一部分进去。
两个序列的中位数:
分别求出两个序列的中位数a和b
比较两个数a和b
如果a和b两个数相等 则这个数是两个序列的中位数。
如果a<b,则中位数只出现在a与b之间 舍弃掉a之前的元素 和b之后的元素
如果a>b,则中位数只出现在b与a之间 舍弃掉a之后的元素 和b之前的元素
折半查找 减治法 插入排序 堆排序 约瑟夫问题
约瑟夫问题的公式
当n为偶数时,某人原来位置=新位置×2-1
幸存者的初始位置L(n,2)=2L(n/2,2)-1
当n为奇数时, L(n,2)=2L((n-1)/2,2)+1

折半查找
low=1; high=n;
mid=(low+high)/2;
if r[k]<r[mid]
{mid=(low+mid/2)}
if r[k]>r[mid]
{mid=(high+mid)/2}
if r[k]=r[mid]
则查找成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值