如果大家是因为标题而进来,那我实话告诉你吧,真事!以后我会分享数据结构与算法相关的文章。为什么要学数据结构与算法,我总结了如下几点:

锻炼思维和问题处理能力

提高代码效率

大厂面试必备

情怀(大学没认真学)

基础知识复习

虽然作为一名Java程序员来说,学数据结构与算法的目的不是为了搞学术研究,但是其基础知识和概念还是要过一些的。

逻辑结构:

  • 集合结构

  • 线性结构

  • 树形结构

  • 图形结构

物理结构:

  • 顺序存储结构

  • 链式存储结构

逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标

就是将数据及其逻辑关系存储到计算机的内存中。

算法的五个基本特性:

  • 输入

  • 输出

  • 有穷性

  • 确定性

  • 可行性

算法设计的要求:

  • 正确性

  • 可读性

  • 健壮性

  • 时间效率高和存储量低

时间复杂度

首先,时间复杂度的计算公式为:T(n)=O(f(n)),这种表示法称为:大O符号表示法。

T(n)表示语句总的执行次数,而n表示问题的规模,因为语句总的执行次数是与问题的规模有关系的,因此它俩可以用函数表示。

首先来看一个例子,来看看我们是如何推导出时间复杂度的。

int i=0;int j=0;while (i  i++;  j=i;}

这段代码的时间复杂度T(n)=O(n),为什么呢?

  • 首先第一行代码会被执行1次

  • 第二行代码会被执行1次

  • 第三行代码中的n就是问题的规模

  • 而i

  • i++会被执行n次

  • j=i会被执行n次

上述代码一共执行3n+2次,当n无穷大,2可以忽略,其倍数3也可以忽略,因此f(n)=n。

常用时间复杂度表
执行次数 函数阶 非正式术语
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n²+2n+1 O(n2) 平方阶
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n3+2n2+3n+4 O(n3) 立方阶
2n O(2n) 指数阶

常用的时间复杂度所耗费的时间从小到大依次是:O(1)2)3)n)n)像O(n3),过大的n都会使得结果变得不现实。同样指数阶O(2n)和阶乘阶O(n!)等除非是很小的n值,否则哪怕n只是100,都是噩梦般的运行时间。

另外,还有平均时间复杂度、最坏时间复杂度等概念。

空间复杂度

算法空间复杂度S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于

n所占存储空间的函数。

空间复杂度比较常用的有:O(1)、O(n)、O(n²)。如果算法执行所需要的存储量不随某个变量n的变化而变化,则此算法空间复杂度为一个常量,记为O(1),如下代码所示。

int i=1;int j=2;int m=i+j;

而下面的代码表示的是一个数组,该数组的长度是随n变化而变化的,因此其空间复杂度为O(n)。

int[] m = new int[n];

我们在写代码时,完全可以用空间换取时间。

数组、链表、栈、队列

大家接触到最多的数据结构,就是这四种了吧,所以我觉得没必要讲太多。下面列出数组和链表的关键特性和两者的区别。数组特点:

  • 用一块连续的内存存储:空间利用率低,内存要求比较高
  • 查询简单,增加和删除困难:从头部插入(后面所有元素向后搬移)和删除(后面所有元素向前搬移)效率低
  • 按索引随机访问效率高,为O(1) ,从数组首地址向后偏移即可
  • 数组的大小是固定的,不能进行动态扩展

链表特点:

  • 由一系列结点组成,结点可以动态生成

  • 结点包括两部分:数据和指向下一个结点的指针

  • 查询慢,插入删除快

  • 占用不连续空间(不能随机访问,只能从头到尾遍历),空间利用率高

除了单向链表,还有双向链表、单向循环链表、双向循环链表等,这些都是链表的变种,不足为惧。

操作 数组 链表
随机访问 O(1) O(n)
头部插入元素 O(n) O(1)
头部删除元素 O(n) O(1)
尾部插入元素 O(1) O(1)
尾部删除元素 O(1) O(1)

栈:后进先出,LIFO队列:先进先出,FIFO栈和链表是两种特殊的线性结构,它们可以基于数据和链表实现。

栈的应用场景-十进制数转二进制数

十进制数转二进制数的算法:

  • 每次除以2,其余数入栈,商如果为0则结束,不为0则继续除以2,依次类推。

  • 结束后,将栈中元素全部出栈,即为所求的二进制数。

用Java代码实现如下:

Stackstack = new Stack<>();public void ten2Two(int x){int a = x/2;int b = x%2;// 入栈stack.push(b);if(a!=0){        ten2Two(a);    }else{// 求解结束,所有元素出栈        Iterator iterator = stack.iterator();while (iterator.hasNext()){            System.out.print(stack.pop());        }    }}

关于数据结构与算法的入门知识就讲到这里吧,为什么呢?因为我要赶紧去刷题啦!下一篇文章-树。

数据结构中为什么输入数据还没输入完全就结束了_我岂能忍!面试官居然用数据结构和算法“羞辱”我...相关推荐

  1. vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...

    vue中,axios异步加载数据,但是有的文件里面需要用到异步拿到的数据,数据还没拿到,文件已经执行了,这时候数据就是空,就会报错,这个问题怎么解决? 具体表现: 我这边vue项目是进入页面的时候会调 ...

  2. 你连原理都还没弄明白?快来瞧瞧这份Spring面试小抄

    二叉树 定义 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树组成. 图解 二叉树特点 由二叉树定义以及 ...

  3. 树结构有什么好处_什么啊?面试官还在问HashMap了,老知识点了啊

    作者:ShadowJava 链接:https://juejin.im/post/5f172a0ff265da22d6512350 来源:掘金 HashMap为什么经常被面试官问到,但是经常被面试官问趴 ...

  4. 程序员内心独白:四年没见的前女友竟成了我的面试官...

    看着正常人,实则奇葩魂. 面试,是每一个职场人都难以绕开的话题.无论你是初出茅庐的应届毕业生,还是久经沙场的职场老将,都或多或少有过一些印象深刻的面试经历所谓奇葩面试经历- 有人因为面试官的温柔鼓舞, ...

  5. 为什么感觉假期还没开始就快要结束了?

    长假的截止日期临近,假日时间陷入倒计时警告.人类的悲与欢相似,一起欢庆祖国的生日,一起哀伤假期的结束.不能接受现实的摧残,需要大脑上线重新捋一下,原地思考十秒钟:假期都干什么了?这假期怎么一眨眼的就要 ...

  6. 数据结构中的原子、分子和物质

    <数据结构中的原子.分子和物质>源站链接,阅读体验更佳~ 学习数据结构和算法是写出高效率代码的必由之路,在实际的工作中,我们可能不会亲自去造轮子,比如实现一个排序算法,实现一个红黑树,因为 ...

  7. 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  8. react 递归遍历四层树结构 遍历分支中的最后一个节点_图解:数据结构中的 6 种树,你心中有数吗?...

    (给算法爱好者加星标,修炼编程内功) 来源:LemonCoder/后端技术学堂(本文来自作者投稿) 数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习 ...

  9. 图解:数据结构中的6种「树」,你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

最新文章

  1. sorl实现商品快速搜索
  2. Open Sans字体兼容问题解决办法[font-face]
  3. x5675相当于e5_如何辨别电商电脑主机是否二手翻新硬件?揭秘i7级E5电脑主机猫腻...
  4. C语言: ---windows下VS Debug调试
  5. 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用
  6. python read文件的r和rb的区别
  7. 阅读《http权威指南》
  8. 十个程序员必备的网站推荐
  9. RAML规范1.0(译文)
  10. qcqa是什么职位_qc经理是什么职位
  11. 计算机用通讯电压多少,电脑ATX电源改13.8V通信用电源!
  12. 学习笔记三十一:IO流(三)
  13. 史上最全的Android面试题集锦,大厂内部资料
  14. 一次重新的认识--第二次随笔
  15. 各大互联网公司PUA套路,同行必须懂!!!
  16. 基于微服务的司机注册与实名认证(活体检测)
  17. ingress-nginx部署状态为CrashLoopBackOff 问题排查
  18. 国内最大BT下载站(BTChina.net)关闭声明
  19. 信息学奥赛一本通:1157:哥德巴赫猜想
  20. python中imread什么意思_Python 中各种imread函数的区别与联系

热门文章

  1. 接口中的成员只有静态常量和什么_为什么阿里工程师代码写的好?看看他的代码规范就知道了...
  2. 相对、绝对、固定定位,以及其层级关系和脱离文档流的影响
  3. vue_过滤器_note
  4. pandas中计算两列相乘
  5. mysql 数据库 向上取整_PHP取整,四舍五入取整、向上取整、向下取整、小数截取...
  6. android studio开关控件,Android studio实现滑动开关
  7. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例
  8. postman本地请求ip地址变成ipv6_华为认证-IPv6技术-ICMPv6介绍
  9. db2插入的时候怎么自增_3篇长文讲“自增ID”,大部分人仍然搞错了!?
  10. backup ram不稳定 stm32_具备无线能力的STM32,如何让智能手表更加炙手可热?