算法和数据结构(一)

一、入门

数据结构是为了让我们采用更高效的方式存储数据,这样我们的增删改查效率才会更高,因此我们大致可以得出一个概念,数据结构基本有着如下几个功能:1、插入一条新数据2、查询一条特定数据3、删除特定数据4、迭代的访问各个数据
平时编程中接触到的最简单最常见数组其实正是数据结构的鼻祖,可以说每一门编程语言中数组都是很重要的一种数据结构。我们就从数组说起数据结构。

在java中,数组是用来存放同一种类型的数据(object类型除外)

我们在熟悉了数组的基本用法后,让我们来写一点东西,封装一个类,实现一个数据结构的四个基本功能,下面上代码

package discovery;

import lombok.Data;

/**
 * Author :zhanghong
 * Date   :2019-02-16 18:08.
 */
@Data
public class MyArray {
    //定义一个数组
    private int[] array;
    //定义有效长度
    private int elems;
    //定义最大长度
    private int length;

    //构造固定长度的数组

    public MyArray(){
        elems=0;
        length=50;
        array=new int[length];
    }

    //构造指定长度的数组
    public MyArray(int length){
        elems=0;
        length=50;
        array=new int[length];
    }

    //获取有效长度
    public int GetSize(){
        return elems;
    }

    //遍历显示元素
    public void display(){
        for(int i=0;i<elems;i++){
            System.out.println(array[0]+"    ");
        }
        System.out.println();
    }

    //根据下标查找显示单个元素
    public int getelement(int i){
        if(i<0||i>elems){
            System.out.println("数组下边越界");
        }
        return array[i];
    }

    //根据值返回数组下标
    public int getindex(int e){
        int i;
        for(i=0;i<elems;i++){
            if(array[i]==e){
                break;
            }
        }
        if(i==elems){
            return -1;
        }

        return i;

    }

    //添加元素
    public Boolean add(int e){
        if(elems==length){
            return false;
        }else {
            array[elems]=e;
            elems++;
            return true;
        }
    }


    //删除元素 根据值删除(如果删除的元素不是数组的最后一个元素,则需要循环把下一个元素值赋给上一个,最后有效长度-1)
    public Boolean delete(int e){
        int index= getindex(e);
        if(index==-1){
            return false;
        }else {
            if(index==elems-1){
                elems--;
            }else {
                for(int i=index;i<elems-1;i++){
                    array[i]=array[i+1];
                }
                elems--;
            }

            return true;
        }
    }

    //更新数组元素
    public Boolean update(int oldvalue,int newvalue){
        int index=getindex(oldvalue);
        if(index==-1){
            return false;
        }else {
            array[index]=newvalue;
            return true;
        }
    }






}

运行一下看结果

package discovery;

/**
 * Author :zhanghong
 * Date   :2018-08-13 15:00.
 */
public class Run {

    public static void main(String[] args) {
//        MyThread t1 = new MyThread();
//        MyThread t2 = new MyThread();
//        MyThread t3 = new MyThread();
//        t1.start();
//        t2.start();
//        t3.start();
        MyArray myArray=new MyArray(4);
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);
        myArray.display();
        int i=myArray.getelement(0);
        System.out.println(i);
        myArray.delete(4);
        myArray.display();
        myArray.update(3,33);
        myArray.display();
    }

}

 由此可见 数组是可以实现一个数据结构的基本功能的

但是我们也可以总结一下数组的一些特点:

  1. 插入很快,因为是无序的不需要对数据进行排序,只需要直接放到数组末尾即可,这样的特点是满足不了插入到指定位置的需求,有一定局限性
  2. 查找效率一般,根据数组下标查找是很快,但是实际开发中我们更多的是根据具体值的查找,我们发现在数组中查找值是需要遍历的,没查找一次都遍历一次,如果数据够大,那么效率就会很差
  3. 删除数据效率也不高,没删除一个数据,如果不是特殊情况(数据恰好在数组末尾),则需要循环赋值前移
  4. 最后就是他的扩展性,数组是需要确定数组大小的,一但确定了扩展性就很差,太长浪费资源,太短就会不够用

综上,数组方便易用,插入数据也很快,但是删除、查找效率不高,扩展性很差,因此我们需要更有效的数据结构,事实上也确实存在更加有效的数据结构,这是建立在复杂的算法之上的,因此,下一篇我将着重先复习一些经典的、基础的算法

加油!

猜你喜欢

转载自www.cnblogs.com/zhhouse/p/10388890.html