一直琢磨着要好好学数据结构与算法,之前也零星地看了点,但是总是不成体系,我在网上也找了很多这方面的书,但是作为一个初学者,总希望能找到一本适合入门但是又比较实用的书,最后千挑万选地邂逅了《java数据结构与算法》(作者是Robert Lafore),简单地浏览了一下,顿时有了一种“就决定是你了的感觉”。如果你也是一个数据结构与算法的初心者,那我同样推荐你这本书。
之后应该会按章节来记录一下自己的学习心得,以及敲一下课后的编程作业来检验自己的学习成果。
Github: https://github.com/insthink/Java-data-structure
大O表示法
----------------------------------------------------------------------------------------------------------------------
大O表示法可以用来描述一个算法的时间复杂度,它可以简单地描述数据的规模与算法运行时间之间的数量级关系。比如:在无序数组中插入一个元素,则用大O表示法就是O(1),因为每次都是在末尾添加,所以只需要一次操作;而在有序数组中插入一个元素,用大O表示法就是O(N),因为不再是在末尾进行插入,而是要考虑到排列的顺序,分为“寻找”和“插入”两个步骤,假设要插入的位置在最中间,那“寻找”需要消耗N/2的正比时间,而“插入”也需要消耗N/2的正比时间(因为需要将N/2的数据先向上移动,才能插入)。
算法 | 大O表示运行时间 |
线性查找 | O(N) |
二分查找 | O(logN) |
无序数组插入 | O(1) |
有序数组插入 | O(N) |
无序数组删除 | O(N) |
有序数组删除 | O(N) |
编程作业
----------------------------------------------------------------------------------------------------------------------
2.5、设计一个merge()方法,使得将两个有序的源数组合并成一个有序的目的数组。
class OrdArray{
private int[] a;
private int nelem;
//constructor
public OrdArray(int size){
a = new int[size];
nelem = 0;
}
// binaray-search
public boolean find(int search_key){
int upper = nelem - 1;
int down = 0;
while(down <= upper){
int mid = (upper + down) / 2;
if(search_key == a[mid]) return true;
else if(search_key < a[mid]) upper = mid - 1;
else down = mid + 1;
}
return false;
}
// linear-insert
public void insert(int elem){
int i;
for(i = 0; i < nelem; i++){
if(elem < a[i]) break;
}
for(int k = nelem; k > i; k--){
a[k] = a[k-1];
}
a[i] = elem;
nelem++;
}
// linear-delete
public boolean delete(int elem){
if(find(elem) == false){
System.out.println("Not found");
return false;
}
else{
for(int i = 0; i < nelem; i++){
if(a[i] == elem){
for(int k = i; k < nelem; k++){
a[k] = a[k+1];
}
nelem--;
}
}
return true;
}
}
// display it
public void display(){
for(int i = 0; i < nelem; i++){
System.out.print(a[i] + " ");
}
System.out.println("");
}
// merge two ordArray into the one
// we can use the OrdArray instance within the class
public OrdArray merge(OrdArray another_array){
OrdArray dist = new OrdArray(this.nelem + another_array.nelem);
for(int i = 0 ; i < this.nelem; i++){
dist.insert(a[i]);
}
for(int i = 0; i < another_array.nelem; i++){
dist.insert(another_array.a[i]);
}
return dist;
}
}
public class OrdArrayApp{
public static void main(String[] args){
// left is a reference, right is an object
OrdArray arr = new OrdArray(20);
arr.insert(10);
arr.insert(20);
arr.insert(5);
arr.insert(2);
arr.insert(1);
arr.insert(99);
arr.insert(101);
arr.display();
arr.delete(101);
arr.display();
// homework-2.5
OrdArray arr1 = new OrdArray(10);
arr1.insert(1);
arr1.insert(3);
arr1.insert(5);
OrdArray arr2 = arr.merge(arr1);
arr2.display();
}
}