数据结构与算法
文章平均质量分 55
紫红色的紫红
这个作者很懒,什么都没留下…
展开
-
快慢指针判断回文链表------LeetCode(234)
234.回文链表题目:请判断一个链表是否为回文链表。思考:能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题?分析:题目默认链表为单链表,因为链表与数组不同,数组支持随机访问,根据下标随机访问的时间复杂度为O(1),而链表为O(n)。我们无法通过首尾指针的方法判断是否为回文串。解决思路:我们可以使用一种快慢指针的方法来进行判断。快指针每次前进两个单位,慢指针每次前进一...原创 2020-02-27 22:58:08 · 1186 阅读 · 3 评论 -
数据结构之并查集(Union/Find)
1、概念并查集是一种用于处理一些不相交集合(Disjoint Sets)的合并及查询等问题的树形数据结构。下面我们举个例子来引入对并查集的理解。大家都看过古惑仔吧,在香港呢分布着很多的帮派,而每个帮派都有一个老大,比如什么洪兴老大蒋天生,铜锣湾陈浩南。各个帮派人数众多,小弟们通过大哥们相连,而大哥的大哥的最终大哥就是共同的老大,所以拐了很多个弯最终还是同个帮派的人,由共同的老大连接着,...原创 2018-08-27 17:32:26 · 766 阅读 · 0 评论 -
排序算法之堆排序(Heap Sort)——C语言实现
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。算法分析在学习堆排序之前我们要先了解堆这种数据结构。堆的定义如下:n个元素的序列{k1,k2,···,kn}当且满足以下关系时,称之为堆。 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶子结...原创 2018-08-21 16:44:21 · 55656 阅读 · 17 评论 -
排序算法之选择排序(Selection Sort)——Java实现
选择排序的基本思想是:每一趟在n-i+1(i=1,2...,n-1)个记录中选取关键字最小的记录作为序列的第i个元素。思路分析一趟简单选择排序的操作为:,先假设第i(从第一个坐标开始)个关键字为最小值,通过n-i次关键字的比较,选出关键字最小的记录,并和第i个记录进行交换。下面我们以第一躺比较为例来介绍。在第一趟开始时,我们先假定第一个元素是最小值,然后依次与后面的元素进行...原创 2018-08-18 21:47:51 · 2544 阅读 · 1 评论 -
排序算法之希尔排序(Shell‘s Sort)——C语言实现
希尔排序(Shell‘s Sort)又称“缩小增量排序”,它也是一种属插入排序类的 算法。希尔排序的基本思想是:先将整个待排序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。思路分析下面 来看一下图解(图片来源于网络图片原地址) 从上图我们可以知道希尔排序需要一个增量序列来控制每一趟的分组,将分组中的元素...原创 2018-08-17 22:10:41 · 3750 阅读 · 2 评论 -
数据结构之栈(Stack)——C语言实现
1、栈的定义栈(Stack)是限定仅在表位进行插入或删除操作的线性表。对栈来说,表尾端有特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。 我们可以把栈形象化地看成是叠砖块的过程,在一次性只能搬动一块砖块的前提下(砖块真的很重!),我们能进行的操作是:在顶部拿走一块砖块或者放下一块砖块。 砖块的放下与拿走就是我们所说的栈的进栈...原创 2018-07-27 11:19:28 · 11204 阅读 · 6 评论 -
一文带你理解散列表(哈希表)
散列表(Hash Table)也叫哈希表,是一种在实际编程过程中被广泛使用的数据结构,但是你是否真的理解它呢?本篇文章将从原理对其进行分析。散列思想下面举一个例子,学校举报运动会,长跑项目总共有60名选手参加,对每个选手按照年级+班级+参赛序号的方法进行编号,我们希望利用编程对每个运动员的个人信息进行存储,并能通过编号进行快速查找。我们采取的办法是,用数组来存储运动员的信息(数组支持时...原创 2020-03-18 04:07:14 · 323 阅读 · 0 评论 -
详解二分查找(Binary Search)与其变形------java实现
二分查找是一种简单易懂的快速查找算法,时间复杂度也十分优秀,为O(logn),即使是2的32次方规模的大数据,最多也只需比较32次即可找到。思想分析:二分查找运用了二分思想,在一个有序的数据集合中,每次都跟待查找的区间中点作比较,将待查找的区间缩小一半,直到找到待查找的元素,或者区间被缩小为0。下面给出简单实现的java代码。public int binarySearch(...原创 2020-03-12 22:22:55 · 649 阅读 · 0 评论 -
桶排序(Bucket sort)------时间复杂度为O(n)的排序方法(一)
之前我们分别分析了时间复杂度分别为O(n²)和O(nlogn)的排序方法,接下来,我们来分析复杂度为O(n)的排序方法,也称为线性的排序方法。 你可能会想,这几种排序方法为什么能做到线性呢?其实,这几种排序方法并不是基于比较的,也有着较为严苛的应用场景。我们先讲桶排序。桶排序(Bucketsort)核心思想:桶排序顾名思义,是将数据放在几个有序的桶内,将每个...原创 2020-03-10 20:57:14 · 12658 阅读 · 2 评论 -
归并排序与快速排序------时间复杂度为O(nlogn)的排序算法
归并排序与快速排序时间复杂度均为O(nlogn),适合大规模的数据排序且很常用,它们都用到了分治思想,将大的问题分解成小问题来解决。接下来我们分别对其进行分析。归并排序(Merge Sort)思路:归并排序的核心思想是先分后合。假如要排序一个数组,先将其从数组中间分解为两部分,分别进行排序,之后再将排好序的两部分按序合并在一起。解决方法:归并排序用到的是分治思想,分治(处理...原创 2020-03-05 21:44:56 · 2910 阅读 · 2 评论 -
冒泡、插入和选择排序------时间复杂度为O(n²)的排序算法
本文通过围绕三个问题来比较冒泡、插入和选择排序这三个排序算法,加深对这三个排序算法的理解。时间复杂度如何(执行效率)?是否是原地排序算法(内存消耗)?排序是否需要申请额外的内存空间。是否是稳定的排序算法(稳定性)?是否会改变相同值元素的前后位置。冒泡排序(Bubble Sort) public int[] bubbleSort(int[] a, int n) { ...原创 2020-03-03 00:16:51 · 813 阅读 · 0 评论 -
数据结构与算法------渐进时间复杂度分析
在初学数据结构与算法的时候,复杂度分析的学习被我选择性忽略了,刷算法题看题解时也是半知半解,也让我在学习数据结构与算法的时候走了不少弯路。在最近迫于实习就业的压力下,我也决定要把这块难啃的骨头啃下。为什么要进行复杂度分析 常常有这样的疑问,对于一段代码执行的时间和占用的空间大小,通过测试完全可以实现监控,为什么还要做复杂度的分析呢?简单的说原因如下。测试结果受...原创 2020-02-26 23:12:14 · 3968 阅读 · 3 评论