神奇少年的数据结构学习笔记一(算法)

目录

1.初步接触算法

2.算法的定义

3.算法的时间及空间复杂度


1.初步接触算法

正常情况下,要算1~100相加的值,一般程序员第一想法都是 for循环相加算出结果,这也是一种算法

但是说到 高斯求和算法 可能不少的程序员都知道这个算法,但是可能都是记住了但是没有拿出来实用

        /// <summary>
        /// 1~100循环算法
        /// </summary>
        /// <returns></returns>
        public int GetSum()
        {
            int sum = 0, n = 100;
            for (int i = 0; i < n; i++)
            {
                sum = sum + i;
            }
            return sum;
        }
        /// <summary>
        /// 高斯求和算法
        /// </summary>
        /// <returns></returns>
        public int GaussSummation()
        {
            int sum = 0, n = 100;
            sum = (1 + n) * n / 2;
            return sum;
        }

 循环算法的话,求多少的和就得循环多少次,而高斯求和算法无论相加到多少都只需要执行一次,所以算法的质量是很重要的

2.算法的定义

如今普遍认可的对于算法的定义是:

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作

算法的特性

  1. 输入和输出:对于大多数算法来说一般是需要输入参数的,个别情况可以不要输入参数,至少有一个或多个输出;
  2. 有穷性:在执行完有限的步骤后,自动结束而不会无限循环,并且每个步骤在可接受的时间内完成;
  3. 确定性:每一步骤都有具体确定的含义,不会出现二义性。就是说相同的输入只能有唯一的输出结果;
  4. 可行性:每一步都是可行的。也就是说每一步都能通过执行有限的次数完成;

算法的设计要求

算法不是唯一的,同一个问题可能有多种不同的算法解决,所以谈一下算法的设计要求,一个好的算法要满足以下设计要求

  1. 正确性:指算法至少具有输入输出和加工无歧义性,能准确反映问题需求,得到问题正确答案;
  2. 可读性:便于阅读、理解和交流
  3. 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果;
  4. 时间效率高和储存量低:应该是多个算法中 执行时间短和占用存储空间低的被使用

3.算法的时间及空间复杂度

   1.算法的时间复杂度  

    推导大O阶方法 

  1. 用常数1取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高项存在且不是1,去除这个项相乘的常数,得到的就是大O阶
       //用O()表示时间复杂度的记法  称为大O记法

            //------------------------------------常数阶 O(1)   
            int sum = 0, n = 100;         //执行一次  
            sum = (1 + n) * n / 2;        //执行一次    
            Console.WriteLine(sum);       //执行一次   
                                          //注意:保留最高阶项,所以这个不是 O(3) 而是 O(1),单纯分支结构(不包含在循环结构中),其时间复杂度也是O(1)
            
            //------------------------------------线性阶  O(n)
            for (int i = 0; i < n; i++)
            {
                sum = sum + i;          //执行n次        
            }                           //循环内执行n次,所以是O(n)


            //------------------------------------对数阶  O(logn)        执行n的1/2次
            int count = 1;
            while (count < n)
            {
                count = count * 2;
            }                              //由于每次count乘以2以后,就相当于有多少个2相乘后大于n则退出循环,由于2的x次方=n 所以时间复杂度为 O(logn)

            //------------------------------------平方阶  O(n²)        执行n的平方次
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; i++)
                {
                   //执行n*n次        
                }
            }                           //循环内执行n²次,所以是O(n²)

由上述代码可以看出 循环体的时间复杂程度等于循环体的复杂度乘以改循环的运行次数 

常用时间复杂度
执行函数次数 非正式术语
1 O(1) 常数阶
2n+3 O(n) 线性阶
3n² +2n+1 O(n² ) 平方阶
5log2(n)+20 O(logn) 对数阶
2n+3nlog2(n)+19 O(nlogn) nlogn阶
6n³+2n³+3n+4 O(n³) 立方阶
2ⁿ O(2ⁿ)

指数阶

 

 

 

 

 

 

 

 

 

常用的时间复杂度所耗费的时间从小到大依次是:

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)

一般在O(n²)平方阶之后的时间复杂度 ,会由于n值导致噩梦般的运行时间,所以一般不讨论

2.算法的空间复杂度

可以在空间和时间之间进行平衡,空间换取时间

公式为 S(n)=O(f(n))    其中n为问题的规模,f(n)为语句关于n所占存储空间的函数

空间复杂度就是一个算法在运行过程中临时占用的存储空间大小,换句话说就是被创建次数最多的变量,它被创建了多少次,那么这个算法的空间复杂度就是多少。

欢迎大家评论交流或指出错误!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章