【数据结构与算法】之导论

自我介绍

最近开始在 Leetcode 上练习算法题目,一开始用数组,挺简单的。但是很快啊,大量需要利用栈、堆、链表等数据结构才能解决的题目接踵而至,我大意了,我不会,呜呜呜。所以我要开始学习数据结构与算法了。come on!

基本情况

我找了些很多人都推荐的数据结构与算法书籍,经过最近一段时间的调整,现在的学习模式是以《Data Structures & Algorithms in Java》为主,这本书里有大量完整的 Java 源码实现,只要掌握了 Java 基础,基本上都能看懂,可以边上机实操,边理论学习,不会很枯燥,很适合我这种小白。辅助的书籍是《大话数据结构》和《数据结构与算法分析——Java描述》。《大话数据结构》这本书用 C 语言来实现,讲概念和思路的时候很清晰,我当作辅助书籍。当我有看不懂的时候,再去《大话数据结构》里看看概念的介绍。《数据结构与算法分析——Java描述》这本书的代码对小白来说有些简略,讲的没有《Data Structures & Algorithms in Java》这本书细致,所以现阶段我也只是作为补充。打好基础以后,以后抽空再把《算法(第四版)》琢磨透。其他算法书籍诸如《啊哈算法》、《挑战程序设计竞赛》、《数据结构与算法分析——C语言描述》等等,会挑着看。

基本概念

程序设计 = 数据结构 + 算法

数据:可以输入并被计算机程序处理的,描述客观事物的符号

身边处处是数据。例如描述人的 Person 类,描述车的 Car 类,如图二。

数据库:性质相同(具有相同的数量和类型的数据项)的数据元素组成的集合

一个数据库相当于 Java 中的一个类,比如 Person 类,如图二。

数据元素:表示现实世界的一个事物,也叫记录。

一个数据元素相当于 Java 中的一个对象。比如一个叫 sam 的人,如图二。

数据项:一个数据元素被分成若干个数据项,也叫字段。每个数据项都记录其所描述事物的一个特性

一个数据项相当于 Java 中的一个属性。比如 sam 的年龄 age 为 10,,如图二。

在这里插入图片描述

图一、数据、类、对象与属性之间的关系
public class Person {
    private String name; //姓名
    private int age;     //年龄
    private int height;  //身高

    public void eat(){  //吃饭
		return}
    public static void main(String[] args) {
        Person sam = new Person();  //一个叫sam的人
        sam.age = 10;               //他年龄为10岁
    }
}
图二、类、对象、属性的简单表示

数据结构有什么用?

数据结构回答了两个问题:

  • 问题一:数据元素之间存在什么关系?(逻辑结构)

    如果用一个圆圈代表一个数据元素,即一个圈代表一个对象,也称作结点。 逻辑结构分为四种:

1.集合结构1:数据元素之间平等,每个数据元素除了同属于一个集合外,没有其他关系。

在这里插入图片描述
2. 线性关系1:数据元素之间是一对一的线性关系

在这里插入图片描述
3. 树形结构1:数据元素之间存在一对多的层次关系

在这里插入图片描述
4. 图形结构1:数据元素之间存在多对多的网状关系

#pic_center

  • 问题二:数据元素之间存在的关系,在计算机上怎么储存?(物理结构)
    物理结构主要分为四种:
  1. 顺序储存结构:逻辑上是相邻的,在计算机上也是在相邻连续的地址上存放。
  2. 链式储存结构:逻辑上是相邻的,但是在计算机上可能是连续的,也可能是不连续的存放。
  3. 散列储存结构:待办
  4. 索引储存结构:待办

算法有什么用?

算法是解决特定问题求解步骤的描述。在 Java 中,算法经常通过类的方法实现。
一个问题可能可以用多种算法实现,用最合适的算法解决问题,节约时间(时间效率高),节省计算机资源(储存量低),是算法的目的。

算法的五个特性:
输入:算法有大于零个的输入,意味着算法可以没有输入,在 Java 中方法可以不传递参数。
输出:算法至少要有一个输出,不然要算法干嘛?
有穷性:算法在可接受的时间内执行有限的步骤,算法就是为了节约时间,节省计算机资源。
确定性:算法常通过类的方法实现,方法即函数。那必然有函数的性质,指定的输入只能有唯一的结果。
可行性:理论上可行,实际上也要能实行。

算法设计的要求:
正确性
可读性
健壮性

算法的时间复杂度和空间复杂度:很容易理解,不在此赘述。


  1. 图片来自书籍《大话数据结构》 ↩︎ ↩︎ ↩︎ ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值