数据结构

  通过这次数据结构的学习,大概对这个算法有了一定的了解,下面就让我来总结一下。
  在我的理解中,数据结构是一门算法,它对数据进行四大步骤的操作,数据的创建、插入、删除、查找。总的来说,数据结构有三大类:数组队列、链表队列、Hash表。
  1、首先,我来说说数组队列ArrayList是如何对数据进行数据的创建、插入、删除、查找的。
  第一步,要创建一个User用户public class User {},在用户User这个类中我们可以定义它的一些属性,譬如 “int id;”这个属性用于储存信息,然后也可以构造一下用户的第二个属性,用于区分同一个链表下的对象User对象,"public User(int id){this.id = id;}",做完这一切之后就开始创建数组队列ArrayList,(数组队列的四大操作都是在一个方法内执行的,所以在这里必须定义个数组的方法:public void f1(){},在这个方法内执行这一系列的操作),首先创建一个包含100万数据的数组int a[] = new int[1000000];for(int i=0;i<a.length;i++){a[i] = i;},
  第二步是在这100万中插入一个值为一个任意值的数据,在这里不妨设这个数据为c,插入的位置是在第100位,设想一下,如何在这个已经排好序的100万个数据中插入一个值为c的数据并且插入位置在第100位?代码如下:int b[] = new int[1000001];//首先创建一个数据为1000001的数组队列b,  for(int i=0;i<b.length;i++){if(a<99){b[i]=a[i];}//遍历下数组b,令前99位数组a和数组b的数据一样。else if(i==99){b[i] = c;}//在数组b中第100位令值为c,else{
b[i] = a[i-1];}}//从101位到1000001位,数组b的数据等于数组a中的数组-1,这样就执行的插入的操作。
  第三步为删除,如何删除特定位置的数据?在这里就删除第二步里插入在第100位的c值的数据,for(int i = 0;i<b.length;i++){if(i<100){a[i]=b[i];}//对数组b进行遍历,前100位,数组a和数组b的值一样。else{a[i]=b[i+1]; 从101位到1000001位,数组a的值等于数组b的值+1,这样就完成的删除操作。
  第四步为查找,如何在100万个数据中查找特定位置的值?在这里我们假设查找第678的值e,代码如下”:int e = 678;for(int i = 0;i<a.length;i++){if(a[i] ==e){system.out.println("找到了e");}}}//首先遍历一下数组a,从第1位开始遍历,直到第678位,这样就找到了要找的数据e。
  2、链表队列LinkedList,其实它和数组队列在完成创建、插入、删除、查找操作的时候,过程都是大同小异的。
  链表队列LinkedList,首先它和数组队列一样,他们的四大操作都是在一个方法里执行的,所以要先定义一个方法public void f2(){}。
  第一步,创建一个100个数据的链表队列public LinkedList<User> u1 = new LinkedList<User>();LinkedList,for(int i = 0;i<1000000;i++){User u = new User(i);u1.add(u);}//在这里重新定义了下用户User,他的对象为u1表示,然后遍历下,把原用户User里的数据全部添加到链表队列中去,这样就创建了一个位100万数据的链表队列。
  第二步,插入一个特定值到某个位置,在这里我们就插入一个999999(可以任意取),到第100个位置,代码如下:User u2 = new User(999999);u1.add(100, u2);//把数据999999插入到链表队列里的第100位。
  第三步,删除,在这里我们删除第二步插入的数据,u1.add(100, u2);//直接删除第100位的数据。
  第四步,查找,代码如下:int findId = 999;//定义要查找的数据的Id为999
User findUser = u1.get(u1.size());//找出链表里的数据的id
if(findUser.id == findId){//判断链表里的数据的id是否为999
System.out.println("找到了对应的链表中的对象");
}
}
  3、Hash表,首先我来解释一下何为Hash表,从定义出发, Hash表的作用是更快速的操作一些数据,尽可能的实现时间复杂度为1。从结构上出发,我的理解是Hash表由数组队列和链表队列组成,首先给力一个数组队列,对于一系列的数据(在这里我们取100万个数据)在给定的某个Hash公式得到一个值,这些值在数组队列中对一个位置,如果通过Hash公式得到的值有重复的(即冲突了),那么就在所得的值在数组队列中的那个位置上建立一个链表队列,把这些值全部放在链表里,在这里,对于链表队列而言,我们就要在前面的基础上在建立一个id,,"int id2;" 用户的第二个属性,用于区分同一个链表下的对象。接下来,让我来演示下用Hash表来操作数据的创建、插入、删除、查找。
  第一步,Hash表的创建(与数组队列和链表队列一样,在这里也要定义一个方法)public void f3(){}//在这个方法里执行Hash表的四大操作。
//创建一个新的链表队列u2,用于储存用户数据,此时链表中没有数据储存,为空
ArrayList<LinkedList<User>> u2 = new ArrayList<LinkedList<User>>();
for(int i = 0;i<1000000;i++){
User u = new User(i);//定义互用User对象u
                  //判断通过Hash公式得到的值所在的链表队列的位置是否为空
if(u2.get(hash(i,u2.size())) != null)//如果不为空
u2.get(hash(i,u2.size())).add(u);//直接把值添加到链表队列上
}else{//如果为空
                      //则在这里重新创建一个链表队列u3,把所得的添加到u3上
LinkedList<User> u3 = new LinkedList<User>();
u2.add(i, u3);
u3.add(hash(i,u2.size()), u);
}
}
  第二步,插入,我们在这里插入一个Id=999,Id2=2的值(即数据我999,在链表队列位置为2的地方插入),代码如下:

                     int cutId = 999;
int cutId2 = 2;
User u = new User(cutId);
u.id2 = cutId2;
u2.get(hash(cutId,u2.size())).add(u);
  第三步,删除,在这里我们就删除第二步中插入的数据,代码如下:
      u2.get(hash(id,u2.size())).size();
for(int i=0;i<u2.get(hash(id,u2.size())).size();i++){
if(u2.get(hash(id,u2.size())).get(i).id2 == 2){
System.out.println("找到了id2 = 2 ,id = 999 的对象");//找到位置
u2.get(hash(id,u2.size())).remove(u2.get(hash(id,u2.size())).get(i));
}
}
  第四步,查找,查找一个给定位置的数据很简单,在第三步删除操作中我们就用到了,
  u2.get(hash(id,u2.size())).size();
for(int i=0;i<u2.get(hash(id,u2.size())).size();i++){
if(u2.get(hash(id,u2.size())).get(i).id2 == 2){
System.out.println("找到了id2 = 2 ,id = 999 的对象");
}
}
}
  Hash表中其实没有想象中的那么难,但是它也没有特定公式和模式,它在不同的时间和不同的时空中,它所表示出来的形式又不一样,但是它的目的性是一致的,即花很短的时间执行任务,节约成本。
  以上就是我通过一次接触数据结构这门算法之后的感悟,也许有多很不恰当的地方,或者很多不对的地方,但是学习在于过程,我会努力!

你可能感兴趣的:(java,数据结构)