算法简介

时间:2022-06-22
本文章向大家介绍算法简介,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/81543267

程序设计 = 算法 + 数据结构;这句话指出了程序设计的灵魂所在。我先来了解一下算法。什么是算法?目前没有统一的定义。但是基本含义是有的,即:算法是一系列解决问题的明确指令,对于符合一定顶范围的输入,他能在有限的时间内给出有效的输出。

  1. 这就要求算法的每一个步骤都必须没有歧义。
  2. 必须确定算法所适用的范围。
  3. 同一问题可能存在多种算法。
  4. 不同的算法解题的速度可能存在差异。

初学C语言的时候,我就遇到过求两个数的最大公约数的问题。当时我使用的方法是一个个的穷举。直到找到最大的那个公约数。后来知道了欧几里得算法(辗转相除法)。它不仅实现简单,而且求解的次数远远小于穷举。伪代码描述该算法如下:

gcd(m,n)//求m和n的最大公约数
while n != 0
    t = m%n;
    m = n;
    n = t;
return m;

如果n为0,则直接返回m。否则进行循环。将m%n赋予t,n赋予m,t赋予n。直到这个循环结束(n == 0),返回m即可。

下面给出这个算法的C/C++的实现,其中它的递归版本很有意思,体现了程序设计中的技巧。

//递归版
int gcd(int m, int n)
{
	//并没有比较m和n的大小。
	if (0 == n)
	{
		return m; 
	}
	else
	{
		gcd(n, m%n);//如果m比n小,将会在这里翻转过来,这个设计的很巧妙。
	}
}
//循环版
int gcd(int m, int n)
{
    while (0 != n)
	{
        //直接按照算法的描述写代码即可,当然也没有比较m和n的大小
		int r = m % n;
		m = n;
		n = r;
	}
	return m;
}

关于欧几里得算法的证明,可以参考百度百科

算法是程序化解决问题的方案

在设计算法时,尝试手工处理一些规模较小的例子,还需要考虑一下特殊情况。当充分了解了问题之后,在动手设计算法之前还需要了解设备的计算能力,你所设计的算法必须在可接受的时间内给出结果,否则你的算法是没有意义的。还有一部分问题没有精确的解,只好给出一个近似解。程序 = 算法 + 数据结构,所以数据结构有时候和算法设计是分不开的。最后应当还能证明算法的正确性。

正如唐纳德的《计算机程序设计艺术》(英文版是《The Art of Computer Programming》)一书的名字一样,算法还在追求着简单,优美。所以程序设计是一门真正的艺术。一个好的算法是不懈努力和反复修正的结果。

在计算机程序设计中会有一些问题是经常遇到的,例如:排序,查找,字符串处理,图问题,组合问题,几何问题,数值问题。在算法中主要讨论的就是这些问题。

有些算法是简单易懂的,例如二分查找在一个有序序列中,查找一个元素。这样我们很快就能找到它。

#include <iostream>
#include<cmath>
using std::cout;
using std::endl;
int Binary_Search(int *num, int size,int k);
int main()
{
	int i;
	int num[10] = { 0,1,2,3,4,5,6,7,8,9 };
	i = Binary_Search(num, 10, 10);
	if (i - log(10) > 1e-6)
	{
		cout << "没有找到该数字" << endl;
	}
	else
	{
		cout << "该数字下标是:" << i << endl;
	}
	system("pause");
}

int Binary_Search(int * num, int size ,int k)
{
	int i;
	int left = 0, mid, right = size - 1;
	
	for ( i = 0 ;left <= right; i++)
	{
		mid = (left + right) / 2;
		if (num[mid] > k)
		{
			right = mid - 1;
		}
		if (num[mid]<k)
		{
			left = mid + 1;
		}
		if (num[mid] == k)
		{
			i = mid;
			break;
		}
	}
	return i;
}