您的位置:首页 > 理论基础 > 数据结构算法

数据结构 java

2016-11-01 18:58 239 查看

数据结构 java

本文整理了编程开发中遇到的数据结构方面的知识,适合初步接触数据结构的读者阅读

数组

可以快速读取和修改数组下标位置存储的元素值(这时候不需要做比较,只需要找到对应的下标即可完成访问),数组中是不允许有“洞”的,即数组中不允许含有空的位置,我们一般创建数组的时候,需要初始化数组中的元素,或者元素个数,在只初始化元素个数的时候,java语言会为每个数组元素赋默认值。java语言中数组的元素个数是固定,为此提供了ArrayList类对数组进行了扩展。

链表

链表是利用引用的方式,把元素串联起来,在前一个元素中包含对后一个元素的引用,形成了链表结构,这时候的链表叫做单链表,再单链表的基础上新增最后一个元素的引用,形成的链表结构叫做双端链表,双端链表除了可以快速读取最后一个元素外,并没有其他实际的作用,更像是为了引入双向链表的概念,在双端链表的基础上,后一个元素包含前一个元素的因引用,形成的链表结构叫做双向链表,双向链表解决了单链表不能向前查找的缺陷,但也使得编程更加复杂。java中提供的链表实现是LinkedList(基于双向链表实现)。

数组和链表的比较

在空间上:数组是内存中连续存储的,大小固定,结构上不灵活,对内存的利用率低,除非你能清楚数组的准确大小,否则必有浪费。链表是不连续存储的,可以很好的利用内存,但是需要存储链接的引用,所以单个元素的内存开销上要比数组大。

在时间上:数组因为是连续存储的,所有读取速度快,但是插入和删除很慢,因为需要移动数据以防止出现“洞”(为了保存数组的连续特性,连续特性保证了数组的核心价值,即读取速度快),链表读取速度慢,因为需要做比较,但是插入和删除比数组快,因为不需要移动元素,只需要维护其中的向前和向后引用即可。

简单排序

冒泡排序:冒泡行为i-1次,双层for循环实现,外层i-1次标记未排序元素,内层循环j次标记已排序元素,相邻元素两两向前比较交换,直到找到相应顺序位置为止。

选择排序:遍历未排序元素,找到最大的或者最小的,放在已排序元素末尾,循环此过程,双层for循环实现,外层n-1次标记未排序元素,内层循环j次查找未排序元素中哪个最大或者最小,放在已排序元素末尾。

插入排序:遍历未排序元素,插入已排序元素中间的指定位置,循环此过程,插入排序是冒泡排序的优化,双层for玄幻,外层n-1次标记未排序元素,内层循环j次把元素插入到已排序元素中间的指定位置

简单排序比较:冒泡排序最差,选择排序在冒泡排序的基础上交换次数少了,比较次数一样,插入排序的比较次数是冒泡排序的一半,交换次数和比较次数相当,插入排序比冒泡排序快一倍,比选择排序略快(这是指需要排序的元素非常大的情况下,如果采用java实现,数据量较小的情况下,采用选择排序更快,因为元素交换比元素比较的开发大的多)。如果是完全乱序,且数据量较小建议使用选择排序,如果是基本有序,或者数据量超过100万,建议使用插入排序。

抽象数据类型(栈和队列)

栈:先进后出

队列:先进先出,java提供的队列Queue(同步阻塞队列ConcurrentLinkedQueue,同步非阻塞队列BlockingQueue),优先级队列PriorityQueue和双端队列Deque,一般使用Deque实现栈(弃用Stack,不推荐使用)。

这里介绍两个概念

同步、异步:同步是指主调函数等待被调函数返回,异步是指主调函数不等待,继续执行,被调函数执行完后通知主调函数执行结果。同步异步是从调用者是否等待来考虑的。

阻塞、非阻塞:阻塞是指被调函数不满足条件的时候不返回,满足情况的时候才返回。非阻塞是指被调函数不管满不满足条件都返回。阻塞非阻塞是从被调用者是否能及时返回结果的能力来考虑的。

迭代器

迭代器接口要求实现其的类必须提供三种方法:

hasNext():遍历过程中,判断是否还有下一个元素。(从Collection对象的第一个元素开始)

next():遍历该元素。(即取出下一个元素)

remove():移除刚刚遍历过的元素(用该方法在迭代过程中中删除符合条件的元素非常快速)

java中的集合大部分都实现了Iterator接口,可以很方便的进行迭代过程。

递归

递归方法的特性:1、调用自身。2、当它调用自身的时候,它这样做是为了解决更小的问题。3、存在某个足够简单的问题的层次,在这一层算法不需要调用自身就可以直接解答,返回结果。(递归需要消耗方法调用栈的空间和时间,可以采用循环的方式消除递归,可以加快程序的运行速度,但一般情况下不需要这么做,除非递归的层级非常多)

分治算法

把一个大问题,分解成两个相对较小的问题,并且分别解决每一个较小的问题,对每一个较小的问题采用同样的方法,分解成两个更小的问题,并且解决它们,这个过程一直持续下去知道易于求解的基值情况,就不用再分了。分治算法一般采用递归的方式实现。

高级排序

希尔排序:希尔排序是基于插入排序的升级版本,一般项目在初始阶段都可以采用希尔排序,因为它足够简单,但是希尔排序不是效率是变动的。因为该算法的效率受间隔算法的影响。希尔排序通过逐渐变小的元素间隔使元素逐渐有序,直到最终有序为止,推荐使用的元素间隔为(h - 1)/3,h为元素个数,元素通过这个间隔进行排序,直到元素间隔为1为止,这是最后一次排序,之后会得到完整的排序后的元素集合。

快速排序:快速排序是最流行的排序算法,因为有充足的理由相信,在大多数情况下,快速排序都是最快的。建议快速排序采用三数据项取中法(最左,中间,最右)来决定分割枢纽,并在元素个数<=9的子分隔中采用插入排序,可以更好的实现快速排序算法。在快速排序中枢纽一般存储在最右侧,然后划分整个数组,在左边寻找大于枢纽的,在右边寻找小于枢纽的,找到后交换它们的位置,直到左边找到的元素值,大于后边找到的元素值(这时候左边位置标记在大于枢纽的元素集合的左侧第一个位置,右边位置标记在小于枢纽的元素集合的右侧第一个位置,也有可能相同,这时候元素值等于枢纽值),交换左边找到的元素和枢纽元素的位置,完成一个划分过程,重复此分治划分的过程,直到整个元素集合有序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 数据结构