Java数据结构和算法(二)——数组
来源:互联网 发布:网络小贷牌照 人人贷 编辑:程序博客网 时间:2024/05/09 00:32
评论举出了很多错误,一直没再去改正,太懒,确实工作之后变懒了,答应了某人的事情一直也没开始,开头不易,
虽荒废很多时间,但是种下一棵树最好是在十年前,或者是现在。立下的目标也会逐一去实现。
记于2016-6-22 23:39:13
评论中的错误,find返回number看起来是个bug,不过仔细看下判断方法,就发现很特别了。
if(ua.find(1) != ua.number){ System.out.println("find,the number index is "+ua.find(1)); }else{ System.out.println("not found!"); }如果返回的是number,那么说明没找到。思路不同而已。
二分查找有问题,确实是while(end>=start)。
数组的用处是什么呢?——当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用。数组可以进行插入,删除,查找等。
1)创建和内存分配
Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符。
int array[] = new int[10];既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) —— 一切都是对象 的内存分配,array会在栈中开辟空间,并且空间存储着保存数组存储的地址,真正保存对象的地方是对,new操作在堆中开辟了所需的空间,然后array指向头地址。
初始化:
public class UseArray { public static void main(String[] args) { int array[] = new int[10]; System.out.println(array[2]); UseArray a[] = new UseArray[12]; System.out.println(a[1]); int array2[] ={1,2,3,4,5,5,6}; }}new后的数组里面的值被默认初始化为0,而对象的初始化是空的,null,当然还可以通过{}的方式初始化。
2)数组封装后的使用
public class UseArray { private int[] array; private int number = 0; public UseArray(int max){ array = new int[max]; } public void insert(int value){ array[number] = value; number++; } public int find(int value){ for (int i= 0; i < number; i++) { if(array[i]==value) return i; } return number; } public boolean delete(int value){ int index = find(value); if(index != number){ for (int i = index; i < number-1; i++) { array[i] = array[i+1]; } number--; return true; } return false; } public void display(){ for (int i = 0; i < number; i++) { System.out.printf(array[i]+" "); } } public static void main(String[] args) { UseArray ua = new UseArray(5); ua.insert(1); ua.insert(2); ua.insert(6); ua.insert(7); ua.insert(3); ua.display(); if(ua.find(5) != ua.number){ System.out.println("find,the number index is "+ua.find(5)); }else{ System.out.println("not found!"); } if(ua.delete(5)!=true){ System.out.println("can not delete!"); } ua.display(); }}
将整个数组封装,用number代替数组的个数,插入数据的时候也不必理会往哪个下标插,当然,也可以自定义一个具体下标的方法。
方法比较简单就不介绍了,但是存在的一个缺点在delete那里,其实只是从删除元素开始的左移而已,所以,虽然number减少了,但是最后一个元素并没有删除掉,只是display输出展示的时候隐藏了而已,但是,下次插入元素的时候新元素便会取代掉最后一个元素的位置。
3)查找优化——二分查找
public int find(int value){ int start = 0; int end = number-1; while(end>=start){ int index =(end + start)/2; if(array[index]==value){ return index; }else if(array[index] >value){ end = index-1; }else { start = index+1; } } return number; }二分查找前提是数组已经有序。刚开始index写成end和start相减,造成死循环。其实要的是相加。1,2,3,6,7。index=2,value=7,3小于7,start=3,那么index要的是3和4间的中间数,所以是相加之后除以2,6小于7,start=4,find到7。
排序的话倒是看—— Java数据结构和算法(三)——简单排序。
存储对象的话原理一样。
4)大O表示法
设N为数据总数,加入插入一个数据时间为K。
那么线性查找总时间T=K*N/2,因为查找的话大概为比较数目的一半。
二分查找的话T=k*log2(N)。
大O表示法,O可以看成是order of,大约是的意思,k/2也是常数,所以可以看成是O(N)。
数组的缺点呢,就是大小固定,查找慢,如果你要经常查找百万级别的数据,还会用数组吗?不会的,所以数据结构的选用要结合具体的实际情况,达到最大的效率值。
- Java数据结构和算法(二)——数组
- Java数据结构和算法(二)——数组
- Java数据结构和算法(二)——数组
- Java数据结构和算法-数组
- Java 数据结构和算法 数组
- JAVA数据结构和算法(二)—线性查找
- 《java数据结构与算法》——数组
- 数据结构与算法之—数组(二)
- 【Java】Java数据结构和算法(二)——栈和队列
- Java数据结构和算法系列2--数组
- Java数据结构和算法-数组(续)
- Java数据结构和算法:数组、单链表、双链表
- 数据结构回顾版-java数据结构-有序数组和查找算法
- 数据结构和算法------数组
- Java数据结构和算法——数组、单向链表、双向链表
- Java数据结构和算法——数组、单向链表、双向链表
- 二、数据结构与算法--数组
- Java数据结构与算法之数组(二)
- 逆序数的求解
- linux命令 in
- HDU 3555 Bomb
- 博客第一天
- Two Sum
- Java数据结构和算法(二)——数组
- 【POJ1236】Network of Schools 强联通分量缩点(本文kosaraju)
- HDU 4722 Good Numbers
- HDU 1176 免费馅饼
- .DateFormat 与国际化资源
- PHP操作MongoDB学习笔记
- JAVA 复习(Think In Java, 4th) -- Inner Classes - Part2
- 这几天
- java学习——序列化与 Transient 关键字