java 数据结构和算法_数据结构和算法(JAVA).pdf

数据结构:数据结构是指数据在计算机内存空间中或磁盘中的组织形式。

其实java 只是摆脱了显式表露的指针,指针依旧以存储地址的形式埋藏在程序的深处。有

时设置可以说,在java 中所有东西都是指针。这句话虽不是百分之一百的正确,但也差不

多。

引用 (reference)

java 中没有重载操作符。在java 中,任何类似的重新定义都是不可能的,而可以使用命名

的方法,例如add()或其他名字。

在c 和c++中 int 型的大小可能不同,这取决于它们运行的计算机环境;在java 中,一个int

型的变量永远是32 位

数组:插入算法一步 查找 n/2 步 删除需要 (假设不允许数据项重复)查找平均n/2 个

数据项并平均移动剩下的n/2 个数据项来填充删除而带来的洞。总共是N步。

有序数组:查找速度比无序的快很多 插入由于所有靠后的数据都需要移动以腾空空间,

速度较慢

有序数组和无序数组的删除操作都很慢,数据项必须向前移动来填补已删除数据项的洞。

有序数组在查找频繁的情况下十分有用,若插入和删除较为频繁,则无法高效工作。

计算机算法效率:大O表示法

无序数组的插入:常数

T K 在现实情况中,插入所需的实际时间 (不管是微秒还是其他单位)与以下因

素有关:微处理器,编译程序生成程序代码的效率

线性查找:与N成正比 T K*N/2

二分查找:与log(N)成正比

T K*log2(N)

大O表示法使用大写字母O,并省去了常数K. 可以认为O 的含义是"order of"(大约是)。

O(1) 优秀 O(logN)良好 O(N) 还可以 O(N2) 差

大O表示法的实质并不是对运行时间给出时间值,而是表达了运行时间是如何受数据项个

数所影响的。除了实际安装后真正测量一次算法的运行时间之外,这可能是对算法进行比较

的最有意义的方法了。

无序数组可以很快进行插入,O(1),但是查找却需要较慢的时间O (N)时间,删除O(N)

有序数组可以很快查找O(logN)时间,但插入花费O(N),删除O(N)

冒泡排序的算法

O(N2) 比较O(N2) 交换O (N2) 冒泡排序的先排最右边的数据,及最大的下标放最大的

数据

选择排序的算法

O(N2) 比较O(N2) 交换次数O(N) 先排序最左边的,及最小的下标放最小的数据

插入排序的算法

O(N2) 对于随机的数据来说,需要O(N2)的比较,复制的次数大致等于比较的次数。然而,

一次复制与一次交换的事件耗费不同,所以相对于随机数据 ,这个算法比冒泡排序快一倍,

比选择排序略快。 对于已经有序或基本有序的数据来说,插入排序要好得多。

排序的稳定性

算法对需要排序的数据进行排序,让不需要排序的数据保持原来的顺序。某些算法满足这

样的要求,它们就可以称为 稳定的算法。(如果具有相同关键字的数据项,经过排序它们

的顺序保持不变,这样的排序就是稳定的)

上述算法都是稳定的

栈 (Stack)只允许访问一个数据项:即最后插入的数据项。

大部分微处理器运用基于栈的体系结构。当调用一个方法时,把它的返回地址和参数压入栈,

当方法结束返回时,那些数据出栈。栈操作就嵌入在微处理器中。

栈的概念和实现它的内部数据结构应该是完全分开的,栈可以用数组来实现,也可以用其他

的存储结构,比如链表来实现。

栈通常很小,是临时的数据结构。

栈通常用于解析某种类型的文本串。通常,文本串是用计算机语言写的代码行,而解析他们

的程序就是编译器。

栈是一个概念上的辅助工具,栈在抽象概念上更便于使用。栈通过提供限定性的访问方法

push()和pop(),使程序易读且不易出错。

用数组实现的栈的入栈和出栈的事件复杂度都为常数O(1).也就是说,栈操作所消耗的时间

不依赖与栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。

Queue(队列)

数组可以实现队列,链表也可以用来实现队列

和栈一样,队列中插入数据项和移除数据项的时间复杂度均为O(1)

双端队列与栈或队列相比,是一种多用途的数据结构,在容器类库中有时会有双端队列来提

供栈和队列的两种功能。但是不太常用

优先级队列是比栈和队列更专用的数据结构。但它在很多情况下都很有用。像普通队列一样,

优先级队列有一个队头和一个队尾,并且也是从队头移除数据项。不过在优先级

队列中,数据项按关键字的值有序,这样关键字最小的数据项 (或在某些实现中是关键字最

大的数据项)总是在队头。

数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。

优先级队列通常使用一种称为堆的数据结构来实现。 也可以用简单的数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值