经典算法宝典——迭代思想(二)(1)

迭代法(Iteration)也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。

说明:

迭代算法一般用于数值计算,比如累加、累乘都是迭代算法策略的基础应用。

利用迭代算法策略求解问题,设计工作主要有3步。

(1)确定迭代模型

根据问题描述,分析得出前一个(或几个)值与其下一个值的迭代关系数学模型。当然这样的迭代关系,最终会迭代出求解的目标。确定迭代模型是解决迭代问题的关键。

(2)建立迭代关系式

递推数学模型一般是带下标的字母,算法设计中要将其转化为“循环不变式”——迭代关系式。迭代关系式就是一个直接或间接地不断由旧值递推出新值的表达式,存储新值的变量称为迭代变量。迭代关系式的建立是迭代算法设计的主要工作。

(3)对迭代过程进行控制

确定在什么时候结束迭代过程,是设计迭代算法时必须考虑的问题,迭代过程的控制通常可分为两种情况:一种是已知或可以计算出来所需迭代次数,这时可以构建一个固定次数的循环来实现对迭代过程的控制。另一种是所需的迭代次数无法确定,需要分析出迭代过程的结束条件,甚至于要考虑有可能得不到目标解(迭代不收敛)的情况,避免出现迭代过程的死循环。

总结:

迭代模型是通过小规模问题的解逐步求解大规模问题的解,表面看正好与递归算法设计相反,但也找到了大规模问题与小规模问题的关系。

1、递推法

(1)兔子繁殖问题

一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问1年中每个月各有多少只兔子。

数学建模:

y(1) = y(2) = 1,y(n) = y(n-1) + y(n-2),n = 3, 4, 5...到此发现这个数列就是著名的斐波那契数列。当n趋于无穷时,斐波那契数列前后两项的商(y(n-1) / y(n))趋于黄金分割数0.618。

算法实现:

#include<stdio.h>

void main()
{
	int i, c, a = 1, b = 1;
	printf("%d\n", a);
	printf("%d\n", b);

	for(i = 1; i <= 10; i++)
	{
		c = a + b;
		printf("%d\n", c);
		a = b;
		b = c;
	}
}

结果输出:

总结:

递推(Recursion)算法是迭代算法的最基本的表现形式。一般来讲,一种简单的递推方式,是从小规模的问题推解出大规模问题的一种方法,也称其为“正推”。

2、倒推法

(1)猴子吃桃问题

一只小猴子摘了若干桃子,每天吃现有桃子的一半多一个,到第10天时就只有一个桃子了,求原有多少个桃子?

数学模型:

a(i) = (1 + a(i+1)) * 2, i = 9, 8, 7, 6, ..., 1

说明:

a(i)表示第i天的桃子数。

算法实现:

#include<stdio.h>

void main()
{
	int i, a = 1;
	for(i = 9; i >= 1; i--)
		a = (a+1) * 2;

	printf("%d\n", a);
}

结果输出:

总结:

倒推法(Inverted Recursion)是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法。

经典算法宝典——迭代思想(二)(1)

时间: 2024-10-19 22:36:00

经典算法宝典——迭代思想(二)(1)的相关文章

经典算法宝典——动态规划思想(六)(2)

1.01背包问题 有N件物品和一个容量为V的背包,第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 解析: 这是最基础的背包问题,特点是每种物品仅有一件,可以选择放或不放.用子问题定义状态,即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.其状态转移方程便是f[i][v] = max{f[i-1][v], f[i-1][v-c[i]]+w[i]},这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的,所以有必要将它详细解

经典算法宝典——贪婪思想(五)(1)

贪婪法(Greedy)又叫登山法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略."贪婪"可以理解为以逐步的局部最优,达到最终的全局最优. 贪婪算法没有固定的算法框架,算法设计的关键是贪婪策略的选择.一定要注意,选择的贪婪策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的决策影响.也就是说某状态以后的过程不会影响以前的状态,只与当前状态有关,也称这种特性为无后效性.因此,适应用贪婪策略解决的问题类型较少,对所采用的贪婪策略一

经典算法宝典——分治思想(四)(1)

分治法(Divide and Conquer)的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的几个相似问题,以便各个击破,分而治之. 说明: 分治策略的应用很广,具体表现形式各异,比如:折半查找.合并排序.快速排序.二叉树遍历(先遍历左子树再遍历右子树).二叉排序树的查找等算法. 一.分治算法框架 1.算法设计思想 分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之.如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方

经典算法之排序问题(二):桶排序、鸽巢排序

鸽巢排序: 鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用. 当涉及到多个不相等的元素, 且将这些元素放在同一个"鸽巢"的时候, 算法的效率会有所降低.为了简便和保持鸽巢排序在适应不同的情况, 比如两个在同一个存储桶中结束的元素必然相等 我们一般很少使用鸽巢排序, 因为它很少可以在灵活性, 简便性, 尤是速度上超过其他排序算法. 事实

十大经典算法

以下就是从参加评选的18种候选算法中,最终决选出来的十大经典算法: 一.C4.5C4.5,是机器学习算法中的一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它.决策树构造方法其实就是每次选择一个好的特征以及分裂点作为当前节点的分类条件. C4.5相比于ID3改进的地方有:1.用信息增益率来选择属性.ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

白话经典算法二叉堆排序之思想简介

常用的排序算法有冒泡排序,插入排序和选择排序.他们的时间复杂度是o(n2),与数据量的平方成正比.他们的效率还是比较低的.现在来说说他们的效率为什么比较低下.以冒泡排序为例,它每一轮都是与相邻的元素进行交换,交换的距离为1,每次每个(没有冒泡出来的)元素都要与前一个比较再交换.每次相邻的比较只能比较出两个元素的大小,不能以整个数组进行参照来确定在整个数组里的大小,也就是说每次的比较不能确定其他元素的相对位置,因而每次比较的贡献不大,所以这样的比较是笨拙的,进而需要完全比较O(n2)次才能得出正确

白话经典算法系列之二 直接插入排序的三种实现

分类: 白话经典算法系列 2011-08-06 19:27 52070人阅读 评论(58) 收藏 举报 算法 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]. 1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2.      将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3.      i+

浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

主要内容: 1.IHT的算法流程 2.IHT的MATLAB实现 3.二维信号的实验与结果 4.加速的IHT算法实验与结果 一.IHT的算法流程 文献:T. Blumensath and M. Davies, "Iterative Hard Thresholding for Compressed Sensing," 2008. 基本思想:给定一个初始的X0,然后通过以下的阈值公式不断地迭代. 二.IHT的MATLAB实现 function hat_x=cs_iht(y,T_Mat,s_r