Java数据结构与算法----浅谈数据结构与算法基本概念

ps:最近忙寄咯,准备下个月找暑假实习还有准备蓝桥杯,所以打算每天抽空出来系统的复习一遍数据结构与算法,顺便记录记录笔记...

1.数据结构:

1.1.什么是数据结构?

数据结构是指互相之间存在一种或者多种关系的数据元素集合。也就是Data_Structure = {Data , Relation}

1.2.数据结构的分类

数据结构可以分为逻辑结构物理结构这两个角度来分类。

1.3.逻辑结构

1.从逻辑关系上描述数据,与数据存储无关。2.从具体问题抽象出来的数据模型。3.与数据元素本身的形式、内容无关。4.与数据元素的相对位置无关

其中,逻辑结构还将数据结构分为:线性结构非线性结构

线性结构中由细分为:线性表(顺序表、链表)、栈、队列、串、数组、广义表等

非线性结构中包含:树、图、堆、矩阵等等。。。

1.4.物理结构(存储结构)

在存储结构上,数据结构又分为了:链式存储结构顺序存储结构

顺序存储结构就是将数据按照存储地址顺序一个一个存放进去,主要的代表就是顺序表。

链式存储结构:不像顺序结构那样,它的存储数据的物理地址可以不是连续的,而是由指针指向对应的存储地址,形成一条链子一样的结构。主要代表就是链表

1.5.总结:

对比顺序与链式的区别:

存储结构

顺序存储结构

链式存储结构

存储方式区别

数据按照存储地址顺序一个一个存放进去

存储数据的物理地址可以不是连续的

crud操作的时间复杂度

查询 O(1)

增、删、改 O(n)

查询O(n)

增、删、改 O(1)

空间分配

需要预分配空间,超出的话就会内存溢出报错

不需要提前预留空间

2.算法

2.1.什么是算法

算法就是解决某个问题的方法,是解决这个问题的详解步骤的描述。

2.2.算法的特性

算法五个基本特性:有穷性、确定性、可行性、输入、输出

算法设计与要求:

正确性:不含有语法错误;对于各种合法的输入数据能够得到满足规格说明要求的结果。

可读性:要求程序有较好的人机交互性,有助于人们对算法的理解。

健壮性:对输入的非法数据能作出适当的响应或处理。

效率与低存储需求:主要指算法的执行时间和所需的最大存储空间,这两方面主要和问题的规模有关。

2.3.算法的时间复杂度

算法的运行时间:算法中每一条语句的执行时间之和。

其中,一条语句的执行时间 = 执行频率* 执行1次需要的时间。

现在出个题目来看看算法的运行次数:

public void test(int n){
        int ans = 0;//执行1次
        for(int i = 0;i<n;i++){ //执行n次
            for(int j = 0;j<n;j++){//执行n*n次
                for(int k = 0;k<n;k++){ //执行n*n*n
                    ans++;//执行n*n*n
                }
            }
        }
    }

而在程序中,我们一般用Landau符号来表示时间复杂度

符号

定义

f(n)=O(g(n))

大O,渐近上限

f(n)=o(g(n))

小o,asymptotically negligible,lim f(n)/g(n)=0

f(n)=Ω(g(n))

渐近下限(当且仅当g(n)=O(f(n)))

f(n)=ω(g(n))

asymptotically dominant (当且仅当g(n)=o(f(n)))

f(n)=Ѳ(g(n))

asymptotically tight bound(渐近紧密界限)

(当且仅当f(n)=O(g(n))且f(n)=Ω(g(n)))

在算法的复杂度计算中,我们一般用O()来表示。

如上题,我们的伏安法复杂度就是O(2*n*n*n+n*n+n+1) = O(n3);

2.4.空间复杂度

空间复杂度是指程序在运行过程中,临时占用的空间大小,包括,输入数据的所占的空间、源程序所占的空间、辅助变量的空间。

注意的一点是:临时占用空间大小并不包括程序的形参占用的空间

比如上一题中,我们的空间复杂度为O(1).

做个题叭:

以下程序段中语句“x++;”的语句频度为( D )
for(i=1; i<=n; i++)
   for(j=1; j<=i; j++)
      for(k=1; k<=j; k++)
        x++;
A. n(n+1)(2n+1)/2      B.   n(n+1)(n+1)/2      C.   n(n+1)(2n+1)/6     D.   n(n+1)(n+2)/6

这个题刚看到的时候还觉得挺难的,但是只要我们按部就班,一步一步计算还是不难的:

下面算法将一维数组a中的n个数逆序存放到原数组中,空间复杂度为(A)
for(i=0; i<n/2;i++)
 {   t=a[i];
     a[i]=a[n-i-1];
     a[n-i-1]=t;
  }
A.O(1)      B. O(n)      C. O(nlog2n)   D. O(n2)
2.5.总结:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stu_kk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值