zoukankan      html  css  js  c++  java
  • 数据结构算法2--算法

        最近面试不多,在家好好学习一下数据结构算法。虽然在大一还是大二的时候学过严蔚敏的数据结构,当时年少无知,上课神游过去了,考试都不知道是怎么糊里糊涂及格了。智商是硬伤呀,开始学习数据结构算法了,希望能够变聪明。

    传统上,我们把数据结构分为逻辑结构和物理结构
    逻辑结构:是指数据对象中数据元素之间的相互关系
    物理结构:是指数据的逻辑结构在计算机中的存储形式。
     
    集合结构                                             当今的我肯定是最棒的
     
    线性结构  一对一
     
    树形结构  数据元素之间存在一种一对多的层次关系
     
    图形结构  数据元素多对多的关系       通过6个人可以认识所有的人
     
     
    物理结构
     
    如何把数据元素存储到计算机的存储器中
    主要针对内存
     
    顺序存储结构  是把数据元素存放在地址连续的存储单元里, 其数关系和物理关系是一致的。
     
    链式存储结构   是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。      叫号 而在等待的时候你爱在哪里在哪里    数据元素的存储关系不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样子通过指针就可以找到相关联的数据元素的位置。
     
     
    算法  算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。   追女朋友的技巧和方式。  
     算法的五大特征    1 输入  具有0个或者多个
                               2 输出  至少有一个或者多个输出
                            3 有穷行
                          4 确定性   
                        5 可行性
    算法设计的要求   1 正确性
                              2 可读性
                             3  健壮性
                            4 时间效率高和存储量低
     
     
    算法效率的度量方法
    事前分析估算方法         1   算法采用的策略 ,方案 2  编译产生的代码质量  3问题的输入规模  4机器执行指令的速度。算法的侧重点是研究算法随着输入规模扩大增长的一个抽象,而不是精确地定位需要执行多少次,因为如果这样的话,我们就得考虑编译器优化等问题。只关心实现算法。
    函数的渐近增长
      判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高项)的阶数。                     
    算法时间复杂度的定义:在惊醒算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。   大O ()记法
    --用常数1取代运算时间中的所有加法常数。
    --在修改后的运行次数函数在在,只保留最高阶项。
    --如果最高阶项存在且不是1,则去除与这个项相乘的常数。
    --得到的最后结果就是大O阶。
     
    常数阶
    int sum = 0,n = 100;
    printf(“i love xiaofang”);
    sum = (1 + n)*n/2;
    O(1)
    线性阶
    一般含有非嵌套循环涉及线性,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长。
    int i,n = 100,sum = 0;
    for(i = 0;i<n;i++)
    {
      sum = sum + i;
    }
    这段代码的时间复杂度为O(n)因为循环体中的代码需要执行n次。
     
    平方阶
    上面是单个循环,嵌套循环。
    int i,j, n = 100;
    for(i= 0;i < n; i++)
    {
      for(j=0;j<n;j++)
      {
        printf("helle");
      }
    }
    这段代码的时间复杂度为O(n^2)
     
    对数阶
    int i= 1,n = 100;
    whlie(i<n)
    {
     i = i * 2;
    }
    循环次数为log(2)n 所以O(logn)。
     
    函数调用的时间复杂度分析
    void func(int count) {
          int j;
         for(j=count;j<n;j++) {
             printf("%d",j);
         }
    }
    时间复杂度为O(n^2).
    n++;  // 执行1次
    func(n);   // 执行n^2
    for(i=0;i<n;i++) {
    func(i);    // n^2
    }
    for(i=0;i<n;i++) {
        for(j=i;j<n;j++) {            // n^2
             printf("%d",j)
           }
    }
     
    常见的时间复杂度
     
     
     
    最坏情况 和 平均情况
    *我们查找一个有n个随机数组成的某个数字,最好的情况是第一个就是,那么算法的时间复杂度为O(1),但是也可能这个数字就在最后一个位置,那么时间复杂度为O(n)。
    *平均运行时间是期望的运行时间。
    *最坏运行时间是一种保证。在应用中,这是最重要的需求,通常除非特别指定,我们提运行时间都是最坏的运行时间。
     
    算法的空间复杂度
    *我们在写代码的时,完全可以空间来还时间。
    *算法的空间复杂度通过计算算法所需要的存储空间实现,算法的空间复杂度的计算公式记作:S(n) = O(发(n)),其中,n为问题的规模,f(n)为语句有关n内存空间的函数
     
  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/pp123/p/5096735.html
Copyright © 2011-2022 走看看