#数据结构与算法

部分背包问题的贪心算法正确性证明

一,部分背包问题介绍首先介绍下0-1背包问题。假设一共有N件物品,第i件物品的价值为Vi,重量为Wi,一个小偷有一个最多只能装下重量为W的背包,他希望带走的物品越有价值越好,请问:他应该选择哪些物品?0-1背包问题的特点是:对于某件(更适合的说法是:某类)物品,要么被带走(选择了它),要么不被带走(没有选择它),不存在...

分治算法思想介绍

一,介绍分治算法主要包含两个步骤:分、治。分,就是递归地将原问题分解成小问题;治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式分治算法一般都可以写出一个递归表达式;比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N)T(N)代表整个原问题,采...
代码星球 代码星球·2020-04-04

排序算法总结之希尔排序

一,希尔排序算法介绍①希尔排序又称缩小增量排序,它本质上是一个插入排序算法。为什么呢?因为,对于插入排序而言,插入排序是将当前待排序的元素与前面所有的元素比较,而希尔排序是将当前元素与前面增量位置上的元素进行比较,然后,再将该元素插入到合适位置。当一趟希尔排序完成后,处于增量位置上的元素是有序的。②希尔排序算法的效率依...
代码星球 代码星球·2020-04-04

排序算法总结之快速排序

一,快速排序介绍快速排序与归并排序一样,也是基于分治的递归算法,体现在:在每一趟快速排序中,需要选出枢轴元素,然后将比枢轴元素大的数组元素放在枢轴元素的右边,比枢轴元素小的数组元素都放在枢轴元素的左边。然后,再对分别对枢轴元素左边和枢轴元素右边的元素进行快速排序。 二,快速排序算法分析 ①相比于直接...
代码星球 代码星球·2020-04-04

排序算法总结之归并排序

一,归并排序介绍归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时),将划分的有序子数组合并成一个更大的有序数组。为什么是有序子数组???归并排序的递归公式:T(N)=2T(N/2)+O(N)从公式...
代码星球 代码星球·2020-04-04

排序算法总结之堆排序

一,堆排序介绍堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大。将待排序的数组建堆,然后不断地删除堆顶元素,就实现了排序。关于堆,参考:数据结构--堆的实现之深入分析下面的堆排序算法将数组中的元素从小到大排序,用大顶堆来实现。 二,堆排序算法分析 现给定了一维数组,需要将数组中的元素使用堆排序...
代码星球 代码星球·2020-04-04

排序算法总结之插入排序

一,插入排序介绍 插入排序是基于比较的排序。所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置。因此,对于这类排序,就有两种基本的操作:①比较操作;②交换操作其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执...
代码星球 代码星球·2020-04-04

各种排序算法的总结

都是基于内存的排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序14年在网易Blog上写的,现把它放到这里。  一,直接插入排序    总体思路:位于表中后面的元素依次与表中前面的元素比较,若比之小,则还需继续和更前面的元素比...
代码星球 代码星球·2020-04-04

并查集与贪心算法的应用之求解无向图的最小生成树

一,介绍本文介绍使用Kruskal算法求解无向图的最小生成树。Kruskal是一个贪心算法,并且使用了并查集这种数据结构。关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图图,肯定有顶点和边。由于求解最小生成树,故边还需要有权值。此外,对于每一条边,需要找到与它相关联的两个顶点,因为在...

数据结构--二项队列分析及实现

一,介绍什么是二项队列,为什么会用到二项队列?与二叉堆一样,二项队列也是优先级队列的一种实现方式。在 数据结构--堆的实现之深入分析的末尾,简单地比较了一下二叉堆与二项队列。对于二项队列而言,它可以弥补二叉堆的不足:merge操作的时间复杂度为O(N)。二项队列的merge操作的最坏时间复杂度为O(logN)...

数据结构--堆的实现之深入分析

一,介绍以前在学习堆时,写了两篇文章:数据结构--堆的实现(上)  和  数据结构--堆的实现(下), 感觉对堆的认识还是不够。本文主要分析数据结构堆(讨论小顶堆)的基本操作的一些细节,比如insert(插入)操作和deleteMin(删除堆顶元素)操作的实现细节、分析...

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词。比如:hive-->five;wine-->line;line-->nine;nine-->mine.....那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,...

无向图的最短路径算法JAVA实现

一,问题描述给出一个无向图,指定无向图中某个顶点作为源点。求出图中所有顶点到源点的最短路径。无向图的最短路径其实是源点到该顶点的最少边的数目。本文假设图的信息保存在文件中,通过读取文件来构造图。文件内容的格式参考这篇文章第一部分。 二,算法实现思路无向图的最短路径实现相对于带权的有向图最短路径实现要简单得多。...

有向图的拓扑排序算法JAVA实现

一,问题描述给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常。要想实现图的算法,如拓扑排序、最短路径……并运行看输出结果,首先就得构造一个图。由于构造图的方式有很多种,这里假设图的数据存储在一个文件中,每一行包含如下的信息:LinkID,SourceID,Destina...

二叉树的层序遍历算法实现

一,问题描述实现二叉树的层序遍历--从根开始,依次向下,对于每一层从左向右遍历。 二,算法分析层序遍历与先序、中序、后序遍历不同。层序遍历用到了队列,而先、中、后序需要用到栈。因此,先、中、后序遍历可以采用递归方式来实现,而层序遍历则没有递归方式。算法步骤:初始时,根结点入队列然后,while循环判断队列不空...
首页上一页...118119120121122...下一页尾页