1. 说下种常的排序算法和分别的复杂度

【快速排序】

原理:快速排序采的是种分治的思想,它先找个基准数(般选择第个值),然后将这个基准数的数字都放到它的左边,然后再递归调,分别对左右两边快速排序,直到每边只有个数字.整个排序就完成了.

  1. 选定个合适的值(理想情况中值最好,但实现中般使数组第个值),称为“枢轴”(pivot)。
  2. 基于这个值,将数组分为两部分,较的分在左边,较的分在右边。
  3. 可以肯定,如此轮下来,这个枢轴的位置定在最终位置上。
  4. 对两个数组分别重复上述过程,直到每个数组只有个元素。
  5. 排序完成。

复杂度:O(n)

特点:快速排序是我们平常最常使的种排序算法,因为它速度快,效率,是最优秀的种排序算法.

【冒泡排序】

原理:冒泡排序其实就是逐较交换,进外两次循环,外层循环为遍历所有数字,逐个确定每个位置,层循环为确定了位置后,遍历所有后没有确定位置的数字,与该位置的数字进较,只要该位置的数字,就和该位置的数字进交换.

复杂度:O(n^2),最佳时间复杂度为O(n)

特点:冒泡排序在我们实际开发中,使的还是较少的.它更加适合数据规模较少的时候,因为它的效率是较低的,但是优点是逻辑简单,容易让我们记得.

直接插排序

原理:直接插排序是将从第个数字开始,逐个拿出来,插到之前排好序的数列.

复杂度:O(n^2),最佳时间复杂度为O(n)

直接选择排序:

原理:直接选择排序是从第个位置开始遍历位置,找到剩余未排序的数据最的,找到最的后,再做交换

复杂度:O(n^2)

特点:和冒泡排序样,逻辑简单,但是效率不,适合少量的数据排序。

2. java写个冒泡排序算法

3. 描述下链式存储结构

a. 线性结构的优点是可以实现随机读取,时间复杂度为O(1),空间利率,缺点是进插和删除操作时较麻烦,时间复杂度为O(n),同时容量受限制,需要事先确定容量,容量过,浪费空间资源,过不能满使要求,会产溢出问题。

b. 链式存储结构的优点主要是插和删除常简单,前提条件是知道操作位置,时间复杂度是O(1),但如果不知道操作位置则要定位元素,时间复杂度为O(n),没有容量的限制,可以使过程中动态分配的分配内存空间,不担溢出问题,但是它并不能实现随机读取,同时空间利率不。

4. 如何遍历一颗二叉树

树节点:

b. 递归先序遍历:先输出节点的值,再递归遍历左右树。中序和后序的递归类似,改变根节点输出位置即可。

c. 递归中序遍历:过程和递归先序遍历类似

d. 递归后序遍历:

5. 倒排个LinkedList

Collections.reverse(linkedList);

6. java写个递归遍历录下的所有件(directory.listFiles())

7. 叉树与红树

叉树


特性:

  • 左树上所有结点的值均于或等于它的根结点的值。
  • 右树上所有结点的值均于或等于它的根结点的值。
  • 左、右树也分别为叉排序树。

查找:

  • 分查找(通过层层的较来查找位置):如查找值为10的节点:9–13–11–10

缺陷:

  • 插容易变成线性形态,查找性能打折扣,这时需要引红树来解决

红黑树

特点:是种平衡的叉查找树,除了符合叉树的特点之外,还符合以下点:

  • 节点是红或。
  • 根节点是。
  • 每个叶节点都是的空节点(NIL节点)。
  • 每个红节点的两个节点都是。(从每个叶到根的所有路径上不能有两个连续的红节点)
  • 从任节点到其每个叶的所有路径都包含相同数的节点。

这些规则保证了红树的平衡。
红树从根到叶的最长路径不会超过最短路径的2倍。
提寻址效率。

添加删除:通过旋来保证平衡

8. b-tree、b+tree多叉树

b-tree(件系统)

B树也称B-树,它是颗多路平衡查找树。我们描述颗B树时需要指定它的阶数,阶数表示了个结点最多有多少个孩结点,般字m表示阶数。当m取2时,就是我们常的叉搜索树。

定义:

  • 1)每个结点最多有m-1个关键字。
  • 2)根结点最少可以只有1个关键字。
  • 3)根结点少有Math.ceil(m/2)-1个关键字。
  • 4)每个结点中的关键字都按照从到的顺序排列,每个关键字的左树中的所有关键字都于它,右树中的所有关键字都于它。
  • 5)所有叶结点都位于同层,或者说根结点到每个叶结点的度都相同。

    插数据,向兄弟节点借,兄弟节点不够则向节点借;

b+tree(mysql索引)

定义:

  • 1)B+树包含2种类型的结点:内部结点(也称索引结点)和叶结点。根结点本身即可以是内部结点,也可以是叶结点。根结点的关键字个数最少可以只有1个。
  • 2)B+树与B树最的不同是内部结点不保存数据,只于索引,所有数据(或者说记录)都保存在叶结点中。
  • 3)m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个树),阶数m同时限制了叶结点最多存储m-1个记录。
  • 4)内部结点中的key都按照从到的顺序排列,对于内部结点中的个key,左树中的所有key都于它,右树中的key都于等于它。叶结点中的记录也按照key的排列。
  • 5)每个叶结点都存有相邻叶结点的指针,叶结点本身依关键字的顺序链接。

9. 谈谈数据结构,如TreeMap

TreeMap实现了红树的结构。

10. 图的深度遍历和度遍历

1、深度优先遍历:

2、度优先遍历:

11. 介绍下红树、叉平衡树

12. 说说java集合,每个集合下有哪些实现类,及其数据结构。

HashMap:

  1. 在HashMap内部,采了数组+链表的形式来组织键值对Entry<Key,Value>(利数组的查询快+链表的插删除快)
  2. HashMap在存储键值对Entry<Key,Value>的时候,会根据Key的hashcode值,以某种映射关系,决定应当将这对键值对Entry<Key,Value>存储在HashMap中的什么位置上
  3. 在JDK1.7进多线程put操作,之后遍历,直接死循环,CPU飙到100%,在JDK 1.8中进多线程操作会出现节点和value值丢失,为什么JDK1.7与JDK1.8多线程操作会出现很不同,是因为JDK 1.8的作者对resize法进了优化不会产链表闭环。

结构:

HashMap扩容:

1、很简单的计算:由于默认的加载因是0.75 ,那么,此时map的阀值是 16*0.75 = 12,即添加第13个键值对<Key,Value>的时候,map的容量会扩充倍。
2、确实如此,但是为了尽可能第减少桶中的Entry<Key,Value>链表的长度,以提HashMap的存取性能,确定的这个经验值。如果读者你对存取效率要求的不是太,想省点空间的话,你可以new HashMap(int initialCapacity, float loadFactor)构造法将这个因设置得些也妨。

扩容步骤:

2. 为何扩容为原来的两倍(性能):

  • 在HashMap通过键的哈希值进定位桶位置的时候,调了个indexFor(hash, table.length
  • 通过限制length是个2的幂数,h & (length-1)和h % length结果是致的。
  • 如果length是个2的幂的数,那么length-1就会变成个mask, 它会将hashcode低位取出来,hashcode的低位实际就是余数,和取余操作相,与操作会将性能提升很多。

put流程:

a. 获取这个Key的hashcode值,根据此值确定应该将这对键值对存放在哪个桶中,即确定要存放桶的索引;
b.遍历所在桶中的Entry<Key,Value>链表,查找其中是否已经有了以Key值为Key存储的Entry<Key,Value>对象,
c1. 若已存在,定位到对应的Entry<Key,Value>,其中的Value值更新为新的Value值;返回旧值;
c2.若不存在,则根据键值对<Key,Value>创建个新的Entry<Key,Value>对象,然后添加到这个桶的Entry<Key,Value>
d.当前的HashMap的(即Entry<key,Value>节点的数)是否超过了阀值,若超过了阀值(threshold), 则增HashMap的容量(即Entry[] table 的),并且重新组织内部各个Entry<Key,Value>排列。

get流程:

a. 获取这个Key的hashcode值,根据此hashcode值决定应该从哪个桶中查找;
b.遍历所在桶中的Entry<Key,Value>链表,查找其中是否已经有了以Key值为Key存储的Entry<Key,Value>对象,
c1. 若已存在,定位到对应的Entry<Key,Value>,返回value c2. 若不存在,返回null;

Java面试题 - 数据结构与算法相关推荐

  1. 汇智动力学院——Java 浅谈数据结构和算法

    以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法", 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...

  2. 基础面试题 — 数据结构与算法

    数据结构 数据结构是对实际问题中的数据元素及相互间的联系的抽象.一般用线性表来表示常用数据结构,线性表分为顺序存储的顺序表和连式存储的链表. 常用数据结构 在学习算法之前,必须要了解一些常用数据结构的 ...

  3. 数据结构和算法 java实现_数据结构与算法——常用数据结构及其Java实现

    前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...

  4. 数据结构与算法(Java版) | 数据结构与算法的重要性

    通过前几讲我给大家介绍的几个经典的算法面试题,相信大家现在应该对数据结构与算法有了一个很浓烈的学习兴趣,嘻嘻

  5. Java+JVM+MySQL+数据结构与算法,一文说清!

    一.不少培训班候选人的简历中,缺乏足够的商业项目年限 不少同学会有这样得感受:投出去不少简历,但就没有面试机会,对培训班出身的朋友来说,可能这种情况更甚,原因是,这些简历没过筛选. 没过筛选的原因无非 ...

  6. Java基础 常见数据结构与算法 项目总结

    Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点? 面向对象(封装,继承,多态): 平台无关性,平台无关性的具体表现在于,Java 是"一次编写,到处运行(Write ...

  7. java二叉排序树_数据结构与算法—二叉排序树(java)

    前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度.规则相对是简单的. 再数据结构中树.图才是数据结构标志性产物,(线性表大多都现成api可以使用),因为树的难度相比线性表大一 ...

  8. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

  9. 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)

    [toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...

  10. 最新java动脑学院数据结构与算法系列视频教程(完整)

    本套据结构与算法视频很完整,有兴趣的朋友可以下载! 下载地址:百度网盘

最新文章

  1. 深入理解C程序内存布局
  2. lua如何打印行号_Lua 字符串处理
  3. SAP License:系统退货处理流程
  4. SSL 重点SSL会话步骤
  5. [BZOJ1594] [Usaco2008 Jan]猜数游戏(二分 + 并查集)
  6. 参与全国软考调查问卷,赢精彩大奖
  7. Hadoop 集群 傻瓜式搭建手记 (一) 软件准备
  8. 从调试数据分析USB通信协议——UVC摄像头【UVC类设备】(五)
  9. win10下itunes安装失败的解决方法
  10. 华为网络设备-Telnet实验
  11. 通过写《费用明细表》发现写sql的乐趣
  12. 三菱凌云3故障代码_三菱.凌云故障代码
  13. 【SpringBoot新手篇】SpringBoot优雅文件上传方式
  14. AWNet: Attentive Wavelet Network for Image ISP AWNet:图像 ISP 的注意力小波网络(个人笔记,勿喷)
  15. 魅力主播曹启泰《上班这点事》经典语录
  16. Modularity(模块性)
  17. Linux系统访问Windows(本机)的Navicat数据库
  18. Phun一个有意思的程序
  19. 【身体这些部位不舒服的时候,你知道意味着什么吗?】收藏起来吧,震惊!实在是太...
  20. git bisect 与 git blame

热门文章

  1. 恶意代码分析实战学习——静态分析
  2. 最低生活保障数据采集(民政部门)Excel到数据库满足审计部门需要 源代码
  3. hough变换检测直线 matlab,Hough变换直线检测MatLab代码 | 学步园
  4. Python + ElasticSearch:有了这个超级武器,你也可以报名参加诗词大会了!
  5. 关于linux驱动管理笔记
  6. navicat怎么导入sql数据库文件
  7. BLE蓝牙协议栈杂谈
  8. 怎么自己制作证件照?如何在线制作证件照电子版?
  9. 怎样测试通达信软件,如何测试通达信指标成功率?
  10. zend studio10运行php,加速Zend Studio 运行的10点技巧