《恋上数据结构与算法》第1季:算法概述

数据结构与算法的学习笔记目录:《恋上数据结构与算法》的学习笔记 目录索引

1. 算法和数据结构

1.1 什么是算法

算法是用于解决特定问题的一系列的执行步骤(方法)。

比如:计算a和b的之和、计算1+2+3+…+n的和

//计算a和b的之和
public static int plus(int a, int b){
    
    return a + b;
}

//计算1+2+3...+n的和
public static int sum(int n){
    
    int result = 0;
    for(int i = 1; i <= n; i++){
    
        result += i;
    }
    return result;
}

求解以上示例的方式不局限于上面所说,还可以采用其他方法进行编码,不管采用何种方式,它们之间效率是又区别的。因此,使用不同的算法,解决同一个问题,效率可能相差非常大。比如:求第n个斐波那契数(fibonacci number)。

1.2 什么是数据结构

算法的概念大家大致明白了吧,那数据结构又是什么呢?

我的理解是:数据结构是算法的基石。如果把算法比喻成美丽灵动的舞者,那么数据结构就是舞者脚下广阔而坚定的舞台。

数据结构(data structure),是数据的组织、管理和存储格式,其使用目的是为了高效地 访问 修改数据

那你们知道数据结构都有哪些组成方式吗?

  1. 线性结构
    线性结构是最简单的数据结构,包括数组、链表、以及由它们衍生出来的栈、队列、哈希表…

  2. 舒适相对复杂的数据结构,其中比较又代表性的是二叉树,由它衍生出了二叉堆之类的数据结构…

  3. 图是更为复杂的数据结构,因为在图中会呈现出多对多的关联关系…
  4. 其他数据结构
    除了以上所说的,还有像跳表、哈希链表、位图等等,之后都会涉及讲解到的。

有了数据结构这个舞台,算法才可以尽情舞蹈。在解决问题时,不同的算法会选用不同的数据结构。例如排序算法中的堆排序,利用的就是二叉堆这样的一种数据结构;再如缓存淘汰算法LRU(Least Recently Used)利用的就是特殊的数据结构哈希链表。

关于算法在不同数据结构上的操作过程,在后续会进行一一的学习滴。

2. 时间复杂度

2.1 如何判断一个算法的好坏呢?

衡量算法的好坏有很多标准,其中最重要的两大标准是算法的时间复杂度和空间复杂度。

那时间复杂度和空间复杂度究竟是什么呢?

某一天,小灰和小黄同时加入同一家公司,老板给他们布置了一个需求,直接用代码实现即可。一天后,小灰和小黄交付了各自的代码,两个的代码实现的功能差不多。但小黄的代码运行一次要花100ms,占用内存5MB;而小灰的代码运行一次要花100s,占用内存500MB。于是…

在上述场景中,小灰虽然也按照老板的要求实现了功能,但他的代码中存在两个很严重的问题。

  1. 运行时间长
    运行别人的代码只要100ms,而运行小灰的代码则要100s,使用者肯定是无法忍受的。

  2. 占用空间大
    别人的代码只消耗5MB的内存,而小灰的代码却要消耗500MB的内存,则会给使用者造成很多麻烦。

由此可见,运行时间的长短和占用内存空间的大小,是衡量一个程序好坏的重要因素。

时间复杂度(time complexity):估算程序指令的执行次数(执行时间)
空间复杂度(space complexity):估算所需占用的存储空间

但问题来了,如果代码都还没运行,我怎么能预知代码运行所花的时间呢?

由于受影响环境的和输入规模的影响,代码的绝对执行时间是无法预估的。但我们却可以预估代码的基本操作执行次数。

2.2 基本操作执行次数

关于代码的基本操作执行次数,就是说每条语句在操作中执行多少次。下面就举代码例子说明

代码1:T(n) = 1,执行次数是常量

	public static void test1(int n) {
    
		
		// if语句执行次数:1
		if (n > 10) {
     
			System.out.println("n > 10");
		} else if (n > 5) {
     // 2
			System.out.println
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛同学debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值