基础算法(一)---抽象数据类型之表

来源:互联网 发布:gba游戏编程 编辑:程序博客网 时间:2024/06/04 06:00

1.表的简单数组实现

对表的所有这些操作都可以通过使用数组来实现。

虽然数组是由固定容量创建的,但在需要的时候可以用双倍的容量创建一个不同的数组。

它解决了由于使用数组而产生的最严重的问题,即为了使用一个数组,需要对表的大小进行估计

数组的扩展实例:

int[] arr = new int[10];    int[] newarr = new int[arr.length * 2];for (int i = 0; i < arr.length; i++) {        newarr[i] = arr[i];}arr = newarr;

数组的实现,

  1. 可以使得pringtlist以线性的时间被执行
  2. findKth则花费常数的时间
  3. 插入和删除操作的花费则潜藏昂贵的开销(需要大量的移动数组中的元素)

如果对表的插入和删除操作都是在表的后端进行的,其后只发生对表的访问(即findKth),那么数组是一个恰当的实现

ArrayList类提供了List ADT的一种可增长数组的实现。

  1. 优点在于,对get和set的调用花费常数时间
  2. 缺点在于,新项的插入和现有项的删除代价昂贵,除非变动是在ArrayList的末端进行

2.表的简单链表实现

为了避免插入和删除的线性开销,需要保证表可以不连续存储,否则表的每个部分都可能需要整体移动。

链表由一系列节点组成,这些节点不必在内存中相连。每个节点均含有表元素和到包含该元素后继元的节点的链(link),称之为next链,最后一个单元的next链引用null。

链表的实现,

  1. 执行printlist和find(K),只要从表的第一个节点开始用一些后继的next链遍历该表即可
  2. findKth不如数组实现的高效,需要从头遍历到第K个
  3. remove方法可以通过修改一个next引用来实现
  4. insert方法需要使用new操作符从系统取得一个新节点,然后执行2次引用的调整
  5. 在表的前端插入和删除一个项的特殊操作都属于常数时间的操作
  6. 如果知道链表的最后一个节点,那么在链表末尾的操作也是常数时间的操作

如果对表的插入和删除操作都是在表的前端进行,那么链表是一个恰当的实现

LinkedList类提供了List ADT的双链表实现。

  1. 优点在于,新项的插入和现有项的删除均开销很小,假设变动的位置已知(否则需要遍历)
  2. 缺点在于,get和set需要遍历,不容易做索引
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 iptv突然无信号怎么办 排气系统故障灯亮怎么办 空调冷凝器坏了怎么办 水温空调不制冷怎么办 用冷风机屋里潮怎么办 空调制热不出水怎么办 空调水管堵了怎么办 空调制冷不出水怎么办 空调出风口漏水怎么办 空调管漏水厉害怎么办 电动车车速变慢怎么办 遥控器按钮掉了怎么办 苹果6屏幕凸起怎么办 三星笔记本开机黑屏怎么办 笔记本电脑开机黑屏怎么办三星 笔记本电脑黑屏怎么办灯是亮得 九代雅阁收音机信号不好怎么办 九代雅阁电瓶亏电怎么办 17款雅阁混动汽车胎压灯怎么办 空调制冷出热风怎么办 轿车方向机漏油怎么办 车钥匙感应不灵怎么办 汽车助力泵漏油怎么办 奔腾b70油耗高怎么办 方向机漏油了怎么办 威志油耗高怎么办 佳美2.4油耗大怎么办 笔记本电脑按键坏了怎么办 电视主板坏了怎么办 面包车电量亏电怎么办 自动挡汽车亏电怎么办 自动挡亏电了怎么办 面包车打不起火怎么办 汽车电瓶亏电怎么办 小车电池没电怎么办 汽车电瓶有电打不着火怎么办 汽车电瓶没电打不着火怎么办 汽车电池没电打不着火怎么办 汽车电瓶亏电打不着火怎么办 自动挡电瓶没电打不着火怎么办 自动挡车子没电打不着火怎么办