算法01

Posted luojianyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法01相关的知识,希望对你有一定的参考价值。

认识时间复杂度:

  • 常数时间的操作:一个操作如果和数据量没有关系,每次都是 固定时间内完成的操作,叫做常数操作。
  • 时间复杂度为一个算法流程中,常数操作数量的指标。常用O (读作big O)来表示。具体来说,在常数操作数量的表达式中, 只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分 如果记为f(N),那么时间复杂度为O(f(N))。
  • 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分 析不同数据样本下的实际运行时间,也就是常数项时间。

 

对数器的概念和使用:

  • 有一个你想要测的方法a
  • 实现一个绝对正确但是复杂度不好的方法b
  • 实现一个随机样本产生器
  • 实现比对的方法
  • 把方法a和方法b比对很多次来验证方法a是否正确
  • 如果有一个样本使得比对出错,打印样本分析是哪个方法出错
  • 当样本数量很多时比对测试依然正确,可以确定方法a已经 正确

冒泡排序细节的讲解与复杂度分析,时间复杂度O(N^2),额外空间复杂度O(1)

void  Bubble_sort(int *t,int len)
{
    for(int i=len-1;i>0;i--)
    {
        for(int j=0;j<i;j++)
        {
            if(t[j]<t[j+1])
                swap(t[j],t[j+1]);
        }
    }
}

选择排序的细节讲解与复杂度分析,时间复杂度O(N^2),额外空间复杂度O(1)

void Selection_sorting(int *t,int len)
{
    for(int i=0;i<len-1;i++)
    {
        int item=i;
        for(int j=i+1;j<len;j++)
        {
            item=t[item]<t[j]?item:j;
        }
        swap(t[i],t[item]);
    }
}

 

插入排序的细节讲解与复杂度分析时间复杂度O(N^2),额外空间复杂度O(1)

void Insertion_sort(int *t,int len)
{
    for(int i=1;i<len;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(t[j]<t[j-1])
            {
                swap(t[j],t[j-1]);
            }
        }
    }
}

冒泡排序和选择排序,这两种排序不管你的数据状况是什么样的,时间复杂度都是O(n*n),但是插入排序的时间复杂度和数据本身的状况有关,但是我们在定义一个算法的时间复杂度往往是用最坏的情况去考虑,所以插入排序的时间复杂度也是O(n*n),但是我们要知道他和选择冒泡排序是有区别的。

 

下面我用一个小的例子来介绍一下递归算法的时间复杂度分析:

例子:求一个数组的最大值

 1 int get_max(int *t,int left,int right)
 2 {
 3     if(left==right)
 4     {
 5         return t[left];
 6     }
 7     int mid = left+(right-left)/2;//这个可以防止溢出
 8     int max1 = get_max(t,left,mid);
 9     int max2 = get_max(t,mid+1,right);
10     if(max1>max2)  return max1;
11     return max2;
12 }

这里这个递归算法的时间复杂度可以写成 T(N) = aT(N/b) + O(n^d),的形式,N代表数据的规模,a代表执行次数(在这个算法里面就是第八行和第九行代码),b的意思就是递归行为将原来的数据分成了多少份(在这里是两份),n^d代表的就是除了递归行为其他其他行代码的时间复杂度(在这里由于其他项代码的时间复杂度是一个常数项,所以d=0)

只要满足T(N) = a*T(N/b) + O(N^d)的形式,就可以使用master公式求解这个式子的时间复杂度。

  1. log(b,a) > d -> 复杂度为O(N^log(b,a))
  2. log(b,a) = d -> 复杂度为O(N^d * logN) 
  3. log(b,a) < d -> 复杂度为O(N^d)

 

以上是关于算法01的主要内容,如果未能解决你的问题,请参考以下文章

片段(Java) | 机试题+算法思路+考点+代码解析 2023

19 01 11 javascript ?????????????????????(???????????????) ??????????????????????????????(代码片段

[linux][c/c++]代码片段01

这两个代码片段有啥区别?

用片段替换某些东西

为啥此代码片段返回意外结果?