zoukankan      html  css  js  c++  java
  • 算法

    一,算法的概念与特征

    1.算法的概念

      算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列。

    2.算法的特征

      1.输入输出

        算法具有零个或者多个输入,至少有一个或者多个输出(没有输出,那么用这个算法干嘛?)

      2.有穷性

        算法必须在执行完有限步骤之后结束,而不会出现无限循环。

      3.确定性

        算法的每一步必须要有确定的含义,不会出现二义性。

      4.可行性

        算法的每一步必须是可行的,也就是说每一步都能够通过执行有限次数完成。

    3.算法效率的度量方法

      1.事后统计法

        这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

      2.事前分析估算方法

        在计算机程序编制前,依据统计方法对算法进行估算。

    二,算法的时间复杂度

    1.算法时间复杂度的定义

      算法的时间复杂度也就是算法的时间度量,我们用输入操作指令的(n次)次数来反映计算机CPU执行程序的耗时。我们通常用大O法来表示。

    2.推到大O法

      1.用常数1取代运行时间中的所有加法常数

      2.在得到运行次数函数中,只保留最高阶项

      3.如果最高阶项存在并且系数不为1,则去除与这个项相乘的常数

      4.得到的结果就是大O阶

    3.常见的时间复杂度及耗时排序

      1.常见的时间复杂度

        

      2.时间复杂度耗时排序

         

    三,算法的空间复杂度

    1.空间复杂度定义

      算法的空间复杂度也就是衡量程序执行消耗的内存大小。在程序中除了CPU执行的指令外,其他分配内存的操作都会增加空间复杂度(如定义一个变量)。

      一般情况下我们指的复杂度是说的时间复杂度。

    2.空间复杂度推导

      程序中在栈或者堆上分配内存的操作(定义变量/对象)我们都进行求和计算即可。

    3.空间复杂度换时间复杂度案例

    /*
        在由一个1-1000自然数组成的数组中,每个数字可能出现0次或者多次,设计一个算法,求出现次数最多的数字。
        
        思路分析:
            - 用map来实现
            - 用空间换时间
    
    */
    # include<iostream>
    # include<map>
    
    using namespace std;
    
    void searchByMap(int array[],int len) // O(n2)
    {
        map<int, int> m;
        // 将出现次数存入到map中
        for (int i = 0; i < len; i++) // n
        {
            map<int,int>::iterator it = m.find(array[i]);// n
            if (it != m.end())
            {
                int tmp = it->second;
                tmp++;
                m[array[i]] = tmp;
            }
            else {
                m.insert(pair<int, int>(array[i], 1));
            }
        }
        // 遍历并求出最大值
        int max = 0;
        int val = array[0];
        for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) // n
        {
            if (max < it->second)
            {
                val = it->first;
                max = it->second;
            }
        }
        // 打印结果
        cout << "出现次数最多的值为:" << val << ",出现次数为:" << max << "" << endl;
    }
    
    void searchByMem(int array[],int len)// O(n)
    {
        // 定义空间
        int tmpArr[1000] = { 0 };
        // 利用空间的下标来缓存每个数据出现的次数
        for (int i = 0; i < len; i++)
        {
            int index = array[i] - 1;
            tmpArr[index]++;
        }
        // 遍历空间
        int val = tmpArr[0];
        int max = 0;
        for (int i = 0; i < sizeof(tmpArr)/sizeof(int); i++)
        {
            if (max < tmpArr[i])
            {
                val = i + 1;
                max = tmpArr[i];
            }
        }
        // 打印结果
        cout << "出现次数最多的值为:" << val << ",出现次数为:" << max << "" << endl;
    }
    
    int main()
    {
        // 定义自然数数组
        int array[] = { 200,1,200,4,200,1,200,4,5,3,200,1,4,5,200,3,4,200,1,4,200,3,4 };
        
        // 用map来实现
        searchByMap(array,sizeof(array)/sizeof(int));
        
        // 用空间换时间方式
        searchByMem(array,sizeof(array) / sizeof(int));
    
        return 0;
    }
  • 相关阅读:
    与 字符串 相关的操作 -- lua语言实现(带有浓厚的 lua 语法特性)
    03-BFC
    11-canvas
    JavaScript知识点 思维导图
    文件系统 函数
    Meta标签大全
    PHP 快速排序
    天气预报API开发
    Zend Studio XDebug调试配置
    启程
  • 原文地址:https://www.cnblogs.com/metalsteel/p/6244682.html
Copyright © 2011-2022 走看看