数据结构与算法(Java)-004-顺序表

  • 对表的所有操作都可以通过使用数组来实现。虽然数组是由固定容量创建的,但在需要的时候可以用双倍的容量创建。
  • 数组的实现可以使得printList以线性时间被执行,而findKth操作则花费常数时间。
  • 插人和删除的花费却潜藏着昂贵的开销,这要看插入和删除发生在什么地方。最坏的情形下,在位置0的插人(即在表的前端插入)首先需要将整个数组后移一个位置,空出空间来,而删除第一个元素则需要将表中的所有元素前移一个位置,因此这两种操作的最坏情况为O(N)。平均来看,这两种操作都需要移动表的一半的元素,因此仍然需要线性时 间。另一方面,如果所有的操作都发生在表的高端,那就没有元素需要移动,而添加和删除则只花费0(1)时间。
  • 存在许多情形,在这些情形下的表是通过在高端进行插人操作建成的,其后只发生对数组的 访问(即只有findKth操作)。在这种情况下,数组是表的一种恰当的实现。
  • 如果发生对表 的一些插人和删除操作,特别是对表的前端进行,那么数组就不是一种好的选择。下一节处理另 一种数据结构:链表(linked list)。

测试代码

package top.itcourse.adt;

public class AdtArray<T> {
    // 1.数组初始大小为10(泛型无法直接创建数组,只能通过Object强转)
    private T[] arr = (T[]) new Object[10];

    // 2.扩展系数
    private double dilatationFactor = 0.75;

    // 3.表的长度(实际存放元素)
    private int length = 0;

    /**
     * 数组扩容为当前大小的两倍
     */
    private void dilatation() {
        T[] aux = (T[])new Object[arr.length*2];

        for(int i = 0; i < arr.length; ++i) {
            aux[i] = arr[i];
        }

        arr = aux;
    }

    /**
     * 检测下标是否越界。
     * @param index:元素下标。
     */
    private void checkIndex(int index) {
        if(index > length || index < 0) {
            throw new RuntimeException("下标越界异常!");
        }
    }

    /**
     * 在表的下标index处添加元素Element,如果index越界,将出现异常。
     * @param index:待插入的下标位置。
     * @param Element:待插入的元素。
     */
    public void add(int index,T element) {
        // 检测扩容
        if(length > arr.length*dilatationFactor) {
            dilatation();
        }

        // 下标越界异常检测
        checkIndex(index);

        // 数组元素进行整体移动
        for(int i = length; i > index; --i) {
            arr[i] = arr[i-1];
        }

        // 正式添加元素
        arr[index] = element;

        // 表 长度加1
        length++;
    }

    /**
     * 在表的末尾添加元素
     * @param Element
     */
    public void add(T element) {
        add(length, element);
    }

    /**
     * 打印表元素
     */
    public void printList() {
        for(int i = 0; i < length; ++i) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }

    /**
     * 返回表中元素个数。
     * @return:表长度
     */
    public int size() {
        return length;
    }

    /**
     * 清空表。
     */
    public void clear() {
         arr = (T[]) new Object[10];
         length = 0;
    }

    /**
     * 移除掉下标为index处的元素。
     * @param index:元素下标.
     */
    public void remove(int index) {
        // 下标值检查
        checkIndex(index);

        for(int i = index; i < length - 1; ++i) {
            arr[i] = arr[i+1];
        }
        length--;
    }

    /**
     * 根据下标index查找元素返回。
     * @param index:元素下标。
     * @return:返回查找结果。
     */
    public T get(int index) {
        // 检测越界
        checkIndex(index);

        return arr[index];
    }

    /**
     * 返回元素首次出现的下标,元素不存在则返回-1,元素存在的唯一标准是两者equals方法返回true。
     * @param elementd:待查找的元素。
     * @return:元素首次出现的下标。
     */
    public int get(T element) {
        for(int i = 0; i < length; ++i) {
            if(arr[i].equals(element)) {
                return i;
            }
        }

        return -1;
    }
}

微信公众号:JavaWeb架构师



其它



源码下载:

关注下方微信公众号,
回复:
DS-AA-Java.code

完整教程PDF版本下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值