数据结构域算法基础 一

-------------------------------------------------------------------简介-----------------------------------------------------------------------------

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

2.正确选择数据结构会使程序的效率大大提高

3.数据结构的例子有数组,栈和链表

4.算法算是完成特定任务的过程

5.在Java中,算法经常通过类的方法实现

6.数据库是指由许多类似记录组成的数据存储的集合



-------------------------------------------------------------------数组-----------------------------------------------------------------------------

1.创建数组

Java中有两种数据类型:基本类型(如int 和 double) 和对象类型。在许多编程语言中(甚至是有些面向对象语言,如c++),数组也是基本类型,但在Java中把他们当作对象来对待

方式一:

int[ ] intArray;

intArray = new int[100];

方式二:

int[ ] intArray = new int[100];

方法三:

int intArray[ ] = new int[100];

2.数组的特性:

2.1, 数组一旦创建,大小不可改变

2.2数组访问是通过下标来访问,且下标从0开始

例:temp = intArray[5];

intArray[4] = 88;

如果访问小于0或比数组大小大的数据项,程序会出现 Array Index Out of Bounds(数组下标越界)的运行时异常

2.3初始化

当创建数组后,如果不另行指定,则数组会自动初始化为空,当访问一个空的数组是,程序会出现Null Pointer Assignment(空指针赋值)的运行时错误

例:int[ ] intArray = { 0,5,4,6,1,5,8 };

int[5] = 8;

2.4 lowArray类和lowArrayAPP类

lowArray.Java中实际上是将一个普通的Java数组封装进lowArray类中,类中的数组隐藏了起来,他是私有的,所以只有lowArray类中的方法才可以访问他,lowArray中有三个方法,setElem()和getElem(),分别用来插入和检索一个数据项,另外一个是构造函数,用来创建一个特定大小的空数组。

lowArrayAPP创建一个lowArray类的对象并用他存储和操作数据,可以将lowArray想象成工具,lowArrayAPP是工具的使用者,现在程序被划分为两个各自扮演不同角色的类,这对于编写一个面向对象的程序来说是关键的第一步

用来存储数据对象的类有时被称为容器类(container class),例如在lowArray.java中lowArray类。通常容器类不仅存储数据,并且提供访问数据的方法和其他诸如排序等复杂的操作

2.5 线性查找

在缺省情况下是线性查找。当查找到的数据比当前数据大的时候,终止查询

       二分查找

当使用二分查找时就体现有序数组的好处,这种查找比线性查找快很多,尤其对大数组来说更为显著

       有序数组

优点:比无序数组快多了,不好的方面是在插入操作中所有靠后的数据都需要移动以腾开空间,所以速度较慢,有序数组和无序数组中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的洞。有序数组在查找频繁的情况下十分有用,但插入和删除较为频繁时,无法高效的工作。

2.6 对数

指数函数的反函数 即a =log b N

b a =N

2.7存储对象


2.8大O表示法

在计算机科学中,这种粗劣的度量方法叫做大O表示法

无序数组的插入:常数

是目前唯一一个与数组中的数据项个体无关的算法,新数据项总被放在下一个有空的地方,所以每次插入的时间相同,我们可以说像无序数组插入一个数据项的时间T是一个常数K

线性查找:与n成正比

在数组数据项的查找中,发现寻找特定数据项所需比较次数为数据项总数的一半,因此设n为数据项总数,搜索时间T与n的一半成正比:

T=K*N/2

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

不要常数

2.9为什么不用数组表示一切

数组的缺点:在一个无序数组中可以很快的插入,但是查找却要花费较慢的时间

在一个有序的数组中可以查找的很快,但插入却花费时间

数组被new创建后,大小尺寸是固定的,但通常在开始设计程序时并不知道会有多少数据将会放入数组中,所以需要猜他的大小,如果猜的过大,会使数组中的某些单元永远不会被填充二浪费空间,如果猜的过小,会发生数组的溢出,最好的情况是会像用户发送警告,最坏的情况则会导致程序崩溃


小结:Java中的数组是对象,由new操作符创建

无序数组可以提供快速的插入,但查找和删除很慢

将数组封装到类中可以保护数组不被随意更改

类的接口由类用户可访问的方法(有时还有字段组成)

类的接口被设计成使类用户的操作更加简单

有序数组可以使用二分查找

以b为底a的对数(大概)是在结果小于1之前用b除a的次数

线性查找需要的时间与数组中数据项的个数成正比

大O表示法为比较算法的速度提供了一种方便的方法

O(1)级时间的算法是最好的,O(logN)次之,O(N)一般,O(N2)最差



-------------------------------------------------------------------简单排序---------------------------------------------------------------------------

3.1冒泡排序

int[] num = { 1,4,7,5,6};

for(int i = 0;i<num.length;i++){

for(int j = 0 ;j<num.length-i;J++){

if(num[i] > num[j]){

int sum = num[i];

num[i] = num[j];

num[j] = sum;

}

}

}

3.2选择排序

选择排序改进了冒泡排序,将必要的交换次数从O(N2)减少到O(N)。不幸的是比较次数仍保持在O(N2).然而,选择排序仍然为大记录量的排序提出了一个非常重要的改进,

例:

3.3插入排序:

在大多数情况下,插入算法是基本的排序算法里最好的一种,虽然插入排序算法仍然需要O(N2)的时间,但是一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值