zoukankan      html  css  js  c++  java
  • 算法简介

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

    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;
    }
    

     

  • 相关阅读:
    用java的眼光看js的oop
    SpringBoot YAML文件特殊类型配置
    【框架】一种通知到多线程框架
    【网络基础】数据包生命
    【网络编程】TCPIP-小笔记集合
    【网络编程】TCPIP-8-套接字的多种选项
    【网络编程】TCPIP-7-域名与网络地址
    【网络编程】TCPIP-6-TCP的半关闭
    Web应用安全防护-WAF
    漫画 | 这样的程序员男友,让我分分钟想剖腹自尽!
  • 原文地址:https://www.cnblogs.com/zy666/p/10504302.html
Copyright © 2011-2022 走看看