JAVA数据结构之数组

  接下来的几篇博文会在最近仔细研读数据结构与算法的书籍后会摘录一些要点和总结一些自己的心得体会,帮助大家更深入地理解java中的数据结构和一些基本的算法,同时巩固自己数据结构和算法这些最基础的计算机知识

  在Java语言中有两种数据类型基本数据类型和对象类型。Java不同于C++,java语言不将数组作为基本的数据类型,而是将数组作为引用数据类型,创建时需要使用new的方式创建数组

  创建数组的方式两种 int[] intArray = new int[100] ,int intArray[] = new int[100] 声明数组最好使用第一种方式,能够清楚地说明[]是数据类型的一部分,而不是变量名的一部分。像很多编程语言一样数组一旦创建长度就不能改变了

  数组初始化:如果尝试访问一个含有null的数组数据项,程序会出现空指针异常(主要是为了在访问某个数据项之前保证对其已经赋值),从而有一种简单的方式来声明数组,创建数组的同时完成了数组的初始化

  int[] intArray = {1,2,3,4,5,6,7}

允许重复和不允许重复数组的比较

  二分法查找能体现出有序数组的好处,这种查找比线性查找快很多,尤其是对大数组来说更为显著。

  有序数组的优缺点

  1. 在查找元素方面比无序数组快多了,同时在插入操作中由于所有靠后的数据都需移动以腾开空间所以有序数组相对于无序数组插入操作速度慢
  2. 有序数组和无序数组的删除操作都需要把当前删除元素的的数据向前移动来填补已经删除的数据项的漏洞,所以说两种数组的删除都很慢

  此处简单地介绍一下我们常用的一种使用大O法表示运行时间

  大O法表示运行时间的意思是:首先我们举个例子,我们知道无序数组查找特定的数据项所需要的平均的比较次数为数据项总数的一半,若设N为数据项总数,搜索时间T与N/2成正比,可得  T = K*N/2 (其中K为一次比较所花的时间,即一个常量)

扫描二维码关注公众号,回复: 1774298 查看本文章

  二分查找与log(N)成正比  我们已知二分查找所需时间公式为 T = K*log2(N)  时间与以2为底N的对数成正比,我们知道对数的特性,所有的对数和其他的对数都成比例,所以上面的时间公式可以换算成  T = K*log(N)  

  大O表示法即不在乎常数,只在乎运行时间和N的变化关系,大O表示法使用大写的字母O,可以认为是“order of”(大约是),我们可以用大O法来描述线性查找使用了O(N)级时间,二分法查找使用了O(logN)级时间,向无序数组插入使用了O(1),或者说是常数级时间。

  一些算法使用大O法表示运行时间

  对数组有了基本的了解之后,似乎仅仅使用数组就可以完成所有的工作,但由于有序数组和无序数组都不能达到一个我们想要的查找插入和删除都达到一个理想的效率,所以我们要需求新的数据类型来尽量达到我们的需求,当然这是以程序的复杂度作为代价的,数组还有一个很大的问题是数组的大小是固定的,通常我们设计程序时是不知道有多少数据存入我们的数组的,所以这样的程序就会有可能造成内存空间的浪费或者数组溢出的危险。

  更灵活的数据结构可以随插入的数据项而扩展大小,比如说我们常说的链表的数据结构

  java中有一个类叫Vector用起来很像数组,但是他可以扩展,这些功能是以效率作为代价的(实现原理是,在插入数据的时候内部数组将要溢出的时候,会创建一个新的数组,把旧数组的内容复制到新数组中去,然后再插入新的数据项,从而实现了可扩展)

  

猜你喜欢

转载自www.cnblogs.com/zhoukebo/p/9227626.html