重新认识下数据结构与算法(一)数据结构

1.数据结构是什么?

数据结构就是我们设计用来存储数据的一种方式,在程序员眼里就是一种工具。说到数据结构,就要说起算法,那么算法是什么呢?

2.算法是什么?

算法就是对数据结构中的数据进行的各种各样的处理。比如排序,算中位数,求平均数等等。

3.我们常见的数据结构有哪些呢?

数组、栈、链表、队列、二叉树、哈希表、堆和图等等都是我们常见的数据结构。在这几种常见的数据结构中,有两个比较特殊,栈和队列。

栈的特点是先进后出,而队列的特点是先进先出。它们的特殊之处在于人们只关心如何去使用它们,而不关心它们是如何实现的。比如栈可以使用数组来实现,也可以使用链表来实现。队列也一样,可以使用数组来实现,也可以使用链表来实现。

(1) 数组

数组是我们最常用的数据类型之一,比如我们经常用到的ArrayList也是使用数组来存储我们的数据的。数组分为有序数组和无序数组,无序数组是指在数组中的数据可以是乱序的,而有序数组是指在数组中的数据必须按照某种顺序进行存储。数组有哪些特点呢?

无序数组的优点:插入的话,比较快,如果知道下标的话,可以非常快的存取。

无序数组的缺点:删除和查找比较慢,查找的话需要数组一个一个去遍历,删除的话则需要将删除后的元素的位置给补全。数组大小也是固定的,如果你插入的数据超出数组的大小就需要去重新定义一个大的数组再将旧数组的数据重新插入到新的数组中。

有序数组的优点:查找相对无序数组来说比较快,因为可以使用二分法进行查找。

有序数组的缺点:插入比较慢,因为你还需要对数据进行比较,选择他合适的位置,删除也比较慢。

数组是如何定义和创建的

    //定义一个数组
    private long[] theArray;
    //初始化数组大小
    theArray = new long[12];

(2)   栈

栈也是我们经常用到的数据结构,栈的特点是后进先出,最先进去的压到栈底,栈顶最先弹出元素。栈的底层可以使用数组实现,当然也可以使用链表实现。

栈的应用场景有哪些呢?单词逆序,分隔符的匹配。

栈的优点:提供后进先出的存取方式,能够作为很多功能的底层存储工具。

(3)  链表

链表也是我们常用的数据结构,链表的分类比较多,有单链表,双端链表和双向链表。

单链表就是只有头节点,其他的节点需要通过这个头节点去链接。

//单项链表的数据结构
class Link{
    //节点存储的数据信息
    private Object object;
    //指向下一个节点
    private Link next;
}
class LinkList{
    //头节点
    private Link first;
}

单链表的优点是:在对头节点进行增删时非常方便

单链表的缺点是:在对尾节点进行增删时非常麻烦,还需要遍历到尾节点才能够处理,并且在删除遍历时要记住上一个节点,这样才能对最后一个节点进行删除。

双端链表是同时拥有头节点和尾节点两个节点的数据结构。

//双端链表
class Link{
    //节点存储的数据信息
    private Object object;
    //指向下一个节点
    private Link next;
}
class LinkList{
    //头节点
    private Link first;
    //尾节点
    private Link last;
}

双端链表的优点是:在对头节点和尾节点进行增加时非常方便

双端链表的缺点是:在对尾节点进行删除时非常麻烦,因为尾节点没有指向对上一个节点的引用。

双向链表是同时拥有对头尾节点的对象的引用,还同时拥有指向上一个节点的引用和指向下一个节点的引用。

//双向链表
class Link{
    //节点存储的数据信息
    private Object object;
    //指向下一个节点
    private Link next;
    //指向上一个节点
    private Link previous;
}
class LinkList{
    //头节点
    private Link first;
    //尾节点
    private Link last;
}

双向链表的优点是:对头尾节点进行增删都非常快

双向链表的缺点是:节点存储的内容多,占据的空间大。

相对组数来说,链表的增加和删除还是比较快的,因为只需要把上下节点的引用指向新的引用就行,但是链表在查找时就比较慢了。

(4)   队列

队列也是我们经常用到的数据结构,对列的特点是先进先出。和栈一样,队列的底层可以使用数组实现,当然也可以使用链表实现。

队列的优点:提供先进先出的存取方式,能够作为很多功能的底层存储工具。

(5)  二叉树

有没有一种既结合有序数组的优点(查找快),又结合链表的优点(增删快)的数据结构呢?二叉树就是一种。

二叉树

如上图所示,就是一棵树,其中A叫做树的根,B和C分别叫做A的左右节点,B也叫做D和E的父节点。像D和E这种没有子节点就叫做叶节点。

像上面这张图所示的,一个父节点最多有两个子节点,所以叫做二叉树。如果一颗二叉树的父节点都是大于他的左子节点,小于等于他的右子节点的话,这样的一颗树就叫做二叉搜索树。

class Tree{
    //根节点
    private Node root;
}
class Node{
    //存储的对象
    private Object object;
    //左子节点
    private Node leftChild;
    //右子节点
    private Node rightChild;
}

二叉树的优点:查找快,插入快,删除也快

二叉树的缺点:删除算法比较复杂

(6)哈希表

哈希表是数据结构中很常用的一种,因为它能够提供快速的插入、删除和查找,时间级差不多接近常量O(1)。哈希表由两种结构,一种是单纯的数组组成,另一种是由数组和链表组成。我们常用的hashMap就是属于第二种的结构,由数组和链表组成(具体可以参考文章https://blog.csdn.net/linjiaen20/article/details/82762933)。

哈希表的优点:插入、删除和查找的效率都非常高。

哈希表的缺点:他是基于数组的,数组创建后难以扩展,如果哈希表基本被填满的话,性能下降得很严重,对遍历不是很友好。

(7) 堆

在程序中我们经常需要用到优先级队列,除了用普通队列对数据进行排序外,堆是一种更好的实现优先级队列的方法,堆的特点是每一个节点的关键字都大于等于这个节点的子节点的关键字。

首先堆也是一颗二叉树,但是他是一颗完全二叉树,也就是说除了树的最后一层节点不是满的,其他的每一层从左到右都需要是满的。如下图所示的

堆虽然是一颗二叉树,但是却常用数组来存储。堆的每一个节点也都符合堆的特点,就是每一个节点的关键字都大于等于这个节点的子节点的关键字。

堆的优点:在插入和删除最大或最小值时效率比普通的优先级队列高

堆的缺点:除了作为优先级队列,其他并没有什么用处。

(8) 图

图是在我们程序中也很常见的一种数据结构,特别是在地图和路径计算相关方面。

图分为有向图和无向图,有权图和无权图。

图的优点:能够很形象地表示我们现实生活中遇到的很抽象的问题,让问题更加直观。

 

小结:在我们设计数据结构的时候,我们要选择哪一种数据结构既要考虑到我们实际的应用场景,也要考虑到算法的复杂程度,最重要的是要考虑算法的时间复杂度和机器的性能。下一节将要写的是在数据结构设计中很重要的算法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值