数据结构与算法---概述

本篇文章纯属于概念性文章,一直以来都在盼望着数据结构与算法的课程,可能是因为某种吸引力,一直想要深入的去学习这门课程,当然想要学习它,就得先了解它,了解当然是从概念开始咯!所以接下来这篇文章大致会分为两个模块来进行描述,其实要想学好数据结构与算法这门课程,我们必须要有良好的数学基础,像什么高数呀,线性代数呀,概率论呀等等,包括我们之前所学习过的离散数学,说到这里,大家心里是不是怕怕滴,毕竟高数不是那么好,重要的是还忘的差不多了,其实不要怕,慢慢来,只要努力,功夫是不会白费滴。加油!

数据结构与算法顾名思义分为数据结构算法两个部分,下面我将会从这两个部分做一个简单的介绍。

数据结构

 数据结构又分为数据和结构两个部分,虽然说是可以分为两个部分,但是两者一起才构成了数据结构,是缺一不可的,也就是说数据结构就是数据和数据之间的一种关系,说到这里那么你肯定会想数据结构解决什么样的问题呢?其实它是将零散的数据实现“整齐划一”,方便以后的操作。

  1. 数据:但凡能够被计算机识别、存储和计算的东西都叫做数据,这些数据在计算机中存储都是以二进制的形式存在的

  2. 结构:数据与数据之间的一种或多种特定的关系

数据结构又分为逻辑结构和物理结构:

  1. 逻辑结构:元素之间的相互关系,是我们想象出来的,并不是实质性的将其存放在计算机中。
  • 集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系
集合结构
  •  线性结构:线性结构中的数据元素之间是一对一的关系
线性结构
  • 树形结构:树形结构中的元素之间存在一种一对多的层次关系
树形结构
  • 图行结构(网状结构):图形结构的数据元素是多对多的关系
图形结构(网状结构)

其实通过上面几个图,我们可以明显的看出来图形结构是最复杂的一种结构,其次是树状结构,但是当图形结构中有的元素之间失去了关联关系就会成为树形结构,当然我们极端的看树形结构中的某一个分支,它也是一个线性结构,当线性结构中元素失去了关联关系,就变成了集合结构。

 2.物理结构:指的是数据的逻辑结构在计算机中的存储形式

  • 顺序存储结构:开辟一组来内需的空间存储数据,通常用数组来实现,数组中空间本身是连续的,保证了数据之间的关系
顺序存储结构
  • 链式存储结构:开辟一组随机的空间存储数据,通常用节点来实现,节点不仅要存储数据,还要存储下一个节点的位置以保证数据之间的关系

 

链式存储结构

注:

    顺序存储结构    查改快      增删慢
    链式存储结构    查改慢      增删快

算法

算法的官方定义为:算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制;简单的说: 算法就是求解一个问题的步骤

例如:求解1+2+3+.......+99+100的和?

方法一:我们可以利用我们小学所学的知识来来解决这个问题,加法结合律(1+99)+(2+98)+........

方法二:利用等差数列的公式来求解(N+1)*N/2

方法三:利用我们所学习的循环知识来解答

int sum=0;
int N=100;
for(int i=1;i<=N;i++){
sum+=i;
}

那么我们可以很明显的知道一个问题的解决方案有很多种,那么我们怎样去选择最优的方案?也就是如何去选择一个最优的算法,由此我们怎样评价一个算法的好与坏?这里我们主要讲两种方法:

  • 事后统计方法:这种方法主要是通过设计好的程序和数据,利用计算u年纪计时器对不同算法程序的运行时间进行比较,从而确定算法效率的高低(这种方法一般不予以采纳)

这种方法具有很多缺陷:

 1、必须事先编好程序,再进行运行,如果处理的数据量较大则会花费大量的时间和精力;

 2、主要取决和依赖与硬件和软件;

 3、算法的测试数据设计困难,数据量较大时会花费很多时间

  • 事情分析估算方法:这种方法主要在计算机程序编译前,依据统计方法对算法进行估算

一个高级程序语言编写的程序在计算机上运行时所消耗的时间取决于几下几个因素:

1.算法采用的策略、方法(算法本身的好与坏,算法好坏的根本)

2.编译产生的代码质量(要有软件来支持)

3.问题的输入规模

4.机器执行指令的速度(要看硬件性能)

也就是说,抛开这些于计算机硬件、软件的相关因素,一个程序的运行时间,依赖于算法的好坏问题的输入规模(所谓问题的输入规模是指输入数据入量的多少),所以要来看一个算法的好坏,这里我们就要先来了解算法的时间复杂度。

时间复杂度

先来看看官方定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=()。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。简称时间复杂度。其中(n)是问题规模n的某个函数。

就想问你晕不晕,反正我是晕了,不过没关系我们通过实例来了解一下

  • 常数阶 O(1) :1表示不随N的增大而增大
int N=100;//执行一次
int sum=(N+1)*N/2;//执行一次

上述代码执行了两次,但是时间复杂度为O(1)

  • 线性阶 O(n):  忽略常数,忽略系数
int sum;//执行1次
int N=100;//执行一次
for(int i=1;i<=N;i++){ //执行N+1次
   sum+=i;   //执行N次
}

上述代码执行了2N+3次(1+1+N+1+N),时间复杂度为O(n),因为随着N的不断增大,这个常数3和系数2都可以省去了,因为N足够大的时候,他们的数量级是一样的。

  • 对数阶 O(logn)
int count=1;
int N=100000;
while(count<N){
count=count*2;
}

上述代码虽然也有循环,随着N的增大也在不断增大,但是这种增大属于加速度减小的的加速运动,如果循环运行了次,那么2^x=N,所以x=log2(N),随着N不断的增大我们这里面的2也可以忽略了,所以时间复杂度为O(logn)

  • 平方阶 O(n^2)
int N=1000;
for(int i=0;i<N;i++){ //执行N+1次
   for(int j=0;j<N;j++){  //执行N+1次
    …………         //执行N^2次
  }
}

除了这几个比较常见的时间复杂度还有nlogn阶(O(nlogn))、立方阶(O(n^3))、指数阶(O(2^n))

其中关系为O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

忽略常数、只保留幂高项、且忽略幂高项的系数

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,这篇博客是关于一位学生利用整个暑假的时间来学习《数据结构与算法》课程并且持续更新的。而引用是一份关于Java数据结构与算法的学习笔记,涵盖了数据结构与算法概述、分类以及算法分析的内容。引用给出了数据结构的官方解释和大白话解释,以及数据结构的分类和物理结构的介绍。 所以,关于数据结构与算法的笔记,你可以参考这些资源来了解数据结构的概念、分类和物理结构,以及算法的分析和时间复杂度等内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构与算法——学习笔记汇总](https://blog.csdn.net/qq_42025798/article/details/118864568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java数据结构与算法1-概述学习笔记](https://blog.csdn.net/qq_45498432/article/details/124067892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值