算法

一,算法的概念与特征

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;
}
原文地址:https://www.cnblogs.com/metalsteel/p/6244682.html