数据结构和算法之线性表

目录

什么是数据结构?什么是算法?

一、循环和递归

二、什么是线性表

三、线性表的抽象数据类型描述

四、线性表查找

五、线性表插入

六、线性表删除

七、线性表的链式存储实现

八、广义表

九、多重链表


 

什么是数据结构?什么是算法?

数据对象在计算机中的组织方式,数据对象与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法

什么是时间复杂度

时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 

一、循环和递归

public class Test1 {
    public static void main(String[] args) {
        // 顺序打印从1到N的正整数
        System.out.println("请输入N:");
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        Long start = System.currentTimeMillis();
        printN1(N);
        Long end = System.currentTimeMillis();
        System.out.println("总共耗时:"+(end-start)+"ms");
    }

    public static void printN(int N){
        for (int i = 1; i <= N; i++) {
            System.out.println(i);
        }
    }

    public static void printN1(int N){
        if (N>0){
            System.out.println(N--);
            printN1(N);

        }
    }
}

当N=100000,调用 printN 方法正常输出,当调用递归方法 printN1时会发生异常

88580
88579
Exception in thread "main" java.lang.StackOverflowError
	at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:691)
	at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579)

异常解析:StackOverflowError 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量,操作数栈,方法出口等等。jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深度,就会抛出StackOverflowError错误。
 

二、什么是线性表

由同类型的数据元素构成有序序列的线性结构

1、表中元素个数称为线性表的长度

2、线性表没有元素时称为空表

3、表起始位置称为表头,表结束位置称表尾

 

三、线性表的抽象数据类型描述

类型名称:线性表

数据对象集:n 个元素构成的有序序列

操作集:线性表的基本操作

四、线性表查找

长度为 n 的线性表,从下标 0 到 n-1 顺序查找,最好的结果是1次,最差的结果是 n 次,平均次数 (n+1)/ 2 次,平均时间性能 O(n)

五、线性表插入

在第 i 个位置插入元素 x ,将 下标 i 及其以后的元素往后移动,移动顺序则是从下标 n-1 到 i,不能从前向后移动

 执行过程:1、检查表空间是否已满  2、插入位置是否合理  3、倒序移动  4、新元素插入  5、指针指向最后的元素

整个算法的时间复杂度都在for循环倒序移动里面,平均移动次数 n/2,平均时间复杂度 O(n)

六、线性表删除

删除第i个元素,判断删除位置的合法性,依照下标 i 到 n-1的顺序向前移动,平均移动次数 (n-1)/ 2 ,时间复杂度O(n)

七、线性表的链式存储实现

通过“链”建立起数据元素之间的逻辑关系,逻辑上相邻的两个元素不要求物理上也相邻,数组要求逻辑和物理上都相邻

对于插入和删除,不需要移动数据元素,只需要修改“链”

1、求表长

时间复杂度为 O(n)

2、查找

根据序号查找;根据值查找 时间复杂度为  O(n)

3、插入

在第 i-1 个节点后面插入一个值为 X 的新结点

(1)先构造一个新节点,用s 指向

(2)再找到第 i-1 个节点用 p 指向

(3)修改指针,插入节点,s.next=p.next,然后 p.next=s,顺序不能颠倒

4、删除

删除第 i 个位置的结点

(1)先找到第 i-1 个位置的结点,用 p 指向

(2)找到第 i 个位置的结点,用 s 指向,s=p.next

(3)修改指针,删除结点,p.next=s.next,释放结点内存

八、广义表

1、广义表是线性表的推广

2、对于线性表而言,n个元素都是基本的单元素

3、广义表中,这些元素不仅可以是单元素,也可以是其它广义表

九、多重链表

链表中的结点可能同时隶属于多个链

1、多重链表中的结点,其指针域会有多个

2、包含2个指针域的链表不一定是多重链表,比如双向链表就不是多重链表

多重链表可以实现复杂的数据结构,如树、图等

矩阵可以用二维数组表示,有两个缺点

1、数组大小需要提前确定

2、稀疏数组造成大量的存储空间浪费

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值