1.数据结构:
相互之间存在一种或多种特定关系的数据元素集合
数据元素之间的关系
1.1数据逻辑结构有四种:
集合:数据仅仅属于同一个 集合,没有其他相互关系
线性:描述一对多的关系
属性:描述一对多的关系
图形:描述一个多对多的关系
数据的逻辑结构一般采用二元组的形式定义:
数据结构=(D,S)
D:数据元素的集合
S: D元素之间的关系的集合
数据的物理结构:逻辑结构在计算机中的存储位置
顺序存储:
链式存储:
1.2 抽象数据类型 ADT
使用三元组表示:ADT=(D,S,P)
D是数据对象 S是D上的关系,P是D上的操
可以对应一个java类,数据对象与数据关系可以通过类的成员变量;哎存储表示,数据操作可以使用方法来实现
算法有五个特性
输入:一个或多个输入
输出:至少一个输出
有穷性:算法中指令的个数是有限的,
确定性:特定的合法的输入,输出唯一
可行性:算法能够实现,并且在有限的时间内完成
算法设计要求:
正确性:没有语法错误
可读性:算法另一个目的是为了交流,方便阅读
健壮性:对于不合理的要求,也能给出合理的提示信息
时间效率高与存储空间小
1.3时间复杂度
渐近时间复杂度,简称时间复杂度,
T(n)=O(f(n)),表示时间规模n的变化情况,确定T(n)的数量级
1.4 空间复杂度
为了求解某一问题,在执行操作期间所需要的存储空间大小,不包含用来输入的空间
1,线性表
数据结构的四种逻辑结构:集合,线性,树形,网状
linearity=(D,R)
1.1 线性表的抽象数据类型
ADT List{
数据对象:
数据关系:
数据操作:
getSize():返回线性表元素的个数
isEmpty():判断线性表是否为空,线性为空返回true.
insert(i,e):在线性表的i索引位置插入元素e
contains(e):在线性表中判断是否存在元素e,存在返回true,
indexOf(e):返回e在线性表中的索引值,不存在返回-1
remove(e):删除线性表中第一个与e相同的元素,删除成功返回删除的元素
remove(i):删除线性表中指定索引值得元素,返回删除的元素
replace(i,e):吧线性表中索引值为i的元素替换为e
get(i):返回线性表中索引值为i的元素
insertBefore(p,e):在线性表中元素p的前面插入元素e
insertAfter(p,e)后面插入元素e
}
1.2 List接口
使用Java中的接口来表示ADT中的操作,
练习:
1 package demo1;
2
3 public interface MyList {
4
5 int getSize();//返回线性表中元素的个数
6 boolean isEmpty();//判断线性表是否为空
7 void insert(int i,Object e);//在线性表的i索引值添加元素e
8 boolean contains(Object e);//判断线性表中元素e的索引值
9 int indexOf(Object e);//返回线性表中元素e的索引值
10 Object remove(Object e);//删除线性表第一个与e相同的元素,并返回该元素
11 Object remove(int i);//删除线性表第一个与i相同的元素,并返回该元素
12 Object replace(int i,Object e);//使用元素e代替i,并返回就得元素
13 Object get(int i);//返回索引值为i的元素
14 boolean insertBefore(Object p,Object e);//在线性表元素p前面插入元素e
15 boolean insertAfter(Object p,Object e);//在线性表元素p后面插入元素e
16
17
18 }
1 package demo1;
2
3 /**
4 * 通过数组实现线性表
5 * @author ASUS
6 *
7 */
8 public class MyArrayList implements MyList {
9 //定义数组
10 private Object[] elements;
11 private static final int DEFAULT_CAPACITY=16;
12 private int size;//保存数据元素个数
13
14
15 //构造方法
16 public MyArrayList() {
17 elements=new Object[DEFAULT_CAPACITY];
18
19 }
20 public MyArrayList(int initialCapacity){
21 elements = new Object[initialCapacity];
22 }
23
24
25
26 @Override
27 //返回元素的个数
28 public int getSize() {
29
30 return size;
31 }
32
33 @Override
34 public boolean isEmpty() {
35 //判断线性表是否为空
36 return size==0;
37 }
38
39 @Override
40
41 public void insert(int i, Object e) {
42 //在线性表的i位置插入元素e
43 if(i<0||i>size){
44 throw new IndexOutOfBoundsException(i+"越界");
45
46 }
47 //如果数组已满,对数组扩容
48 if(size>=elements.length){
49 expandSpace();
50 }
51 //从i开始,把元素依次后移
52 for(int j=size;j>i;j--){
53 elements[j]=elements[j-1];
54
55 }
56 //把元素e存储到i的位置
57 elements[i]=e;
58 //元素个数加一
59 size++;
60
61 }
62
63 //数组扩容
64 private void expandSpace(){
65 //定义一个更大的数组,默认两倍
66 Object[] newElements=new Object[elements.length*2];
67
68 //把原来数组内容复制到新的数组
69 for(int i=0;i<elements.length;i++){
70 newElements[i]=elements[i];
71 }
72 //让原来的数组名指向新的数组
73 elements = newElements;
74
75 }
76 //判断当前线性表中是否包含元素e
77 @Override
78 public boolean contains(Object e) {
79
80 return indexOf(e)>=0;
81 }
82
83 //返回元素e在线性表中第一次的索引值,不存在返回-1
84 @Override
85 public int indexOf(Object e) {
86
87 //遍历数组
88 if(e==null){
89 //如果线性表中用户添加了null
90 for(int i=0;i<size;i++){
91 return i;
92 }
93 }else{
94 for(int i=0;i<size;i++){
95 if(e.equals((elements[i]))){
96 return i;
97
98 }
99 }
100 }
101
102 return -1;
103 }
104
105 //在线性表中删除第一个与e相同的元素
106 @Override
107 public Object remove(Object e) {
108
109 //获得e在线性表中的索引值
110 int index=indexOf(e);
111 if(index<0){
112 return null;//不存在
113
114 }
115 return remove(index);
116 }
117
118 //删除指定索引的元素
119 @Override
120 public Object remove(int i) {
121
122 //判断i是否越界
123 if(i<0||i>=size){
124 throw new IndexOutOfBoundsException(i+"越界");
125
126 }
127 //把要删除的元素保存起来
128 Object old=elements[i];
129 //把i+1开始的元素依次前移
130 for(int j=i;j<size-1;j++){
131 elements[j]=elements[j+1];
132 }
133
134 //把最后的元素置为null
135 elements[size-1]=null;
136 //修改元素的个数
137 size--;
138 return old;
139 }
140
141 //把索引值为i的元素换为e
142 @Override
143 public Object replace(int i, Object e) {
144 //判断索引值是否越界
145 //判断i是否越界
146 if(i<0||i>=size){
147 throw new IndexOutOfBoundsException(i+"越界");
148
149 }
150 //保存原来
151 Object old =elements[i];
152 //替换
153 elements[i]=e;
154 //把越来的返回
155
156 return old;
157 }
158
159 //返回指定索引对应的元素
160 @Override
161 public Object get(int i) {
162 //判断i是否越界
163 if(i<0||i>=size){
164 throw new IndexOutOfBoundsException(i+"越界");
165
166 }
167 return elements[i];
168 }
169
170 //在线性元素p前面加上元素e
171 @Override
172 public boolean insertBefore(Object p, Object e) {
173
174 //获取p的位置
175 int index=indexOf(p);
176 if(index<0){
177 return false;
178 }
179 insert(index,e);
180 return true;
181 }
182
183 //在线性元素后面插入元素e
184 @Override
185 public boolean insertAfter(Object p, Object e) {
186
187 int index = indexOf(p);
188 if(index<0){
189 return false;
190 }
191 insert(index+1,e);
192 return true;
193 }
194
195 //重写toString方法
196 @Override
197 public String toString() {
198 //把线性表中每个元素连接起来,遍历数组中的每个元素
199
200 StringBuilder sb=new StringBuilder();
201 sb.append("[");
202 for(int i=0;i<size;i++){
203 sb.append(elements[i]);
204 if(i<size-1){
205 sb.append(",");
206 }
207 }
208 sb.append("]");
209 return sb.toString();
210 }
211
212
213 }
1 package demo1;
2 /**
3 * 测试
4 * @author ASUS
5 *
6 */
7 public class MyArraylistTest {
8
9 public static void main(String[] args) {
10
11 //创建一个MyArrayList对象
12 MyArrayList list1 = new MyArrayList();
13
14 //判断是否为空
15 System.out.println(list1.isEmpty()); //true
16 System.out.println(list1.getSize()); //0
17
18 //添加元素
19 list1.insert(0, "aa");
20 list1.insert(1, "bb");
21 list1.insert(2, "cc");
22 System.out.println(list1.isEmpty()); //false
23 System.out.println(list1.getSize()); //3
24
25 //把线性表内容输出
26 System.out.println(list1);
27 System.out.println("--------------------------");
28 //5.返回索引
29 System.out.println(list1.indexOf("cc"));
30 System.out.println("--------------------------");
31 //判断是否存在
32 System.out.println(list1.contains("xx"));
33 System.out.println("--------------------------");
34 //删除
35 list1.remove("aa");
36 System.out.println(list1);
37 list1.remove(0);
38 System.out.println(list1);
39 System.out.println("--------------------------");
40 //添加
41 list1.insert(0, "xx");
42 list1.insert(1, "yy");
43 list1.insert(2, "zz");
44 System.out.println(list1);
45 System.out.println("--------------------------");
46 //替换
47 list1.replace(1, "YY");
48 System.out.println(list1);
49 System.out.println("--------------------------");
50 //得到索引对应元素值
51 System.out.println(list1.get(2));
52 //在线性元素p前面加上元素e
53 list1.insertBefore("xx", "ff");
54 System.out.println(list1);
55 //在线性元素p后面加上元素e
56 list1.insertAfter("xx", "RR");
57 System.out.println(list1);
58
59 }
60
61 }
运行结果: