数据结构与算法
文章平均质量分 81
chengonghao
这个作者很懒,什么都没留下…
展开
-
排序--归并排序
归并排序的时间复杂度是 O( nlogn ) ,归并排序比较占用内存,但是是一个稳定的排序算法。C# 版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CSharp{原创 2016-06-07 16:22:42 · 463 阅读 · 0 评论 -
计数排序----算法导论
《算法导论》上已经解释的非常清楚了,于是直接照搬过来吧,本文转载自《算法导论》转载 2016-08-08 10:34:47 · 476 阅读 · 0 评论 -
桶排序的应用
本文转载自:点击打开链接桶排序(Bucket Sort)有时也称为盒子排序(Bin Sort),来源于邮局使用的盒子信件分发方法。桶排序的有效性需假定输入数据是由一个完全随机过程产生,即要求桶排序的输入数据呈均匀分布,例如,输入数据随机均匀分布在区间[0, 1)。桶排序思想如下:1)把区间[0, 1)分解为n个大小相等的桶;2)将n个输入数据按照其取值不同分配到n个转载 2016-08-08 10:45:16 · 1653 阅读 · 1 评论 -
基数排序----算法导论
《算法导论》上已经解释的非常清楚了,于是直接照搬过来吧,本文转载自《算法导论》转载 2016-08-08 10:54:32 · 412 阅读 · 0 评论 -
strcpy 的实现
// 字符串拷贝.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #define CONTAIN_OF_ZERO_BYTE(n) \ (((n - 0x01010101) & (~n)) & 0x80808080)#define TEST(n) (((n - 1) & (~n)) & 0x80)#if 0n = 0 -原创 2016-08-21 14:53:00 · 374 阅读 · 0 评论 -
AVL树,红黑树,B树,B+树,Trie树应用场景简介
转载自:点击打开链接AVL树,红黑树,B树,B+树,Trie树应用场景简介 1.AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多转载 2016-08-10 10:21:38 · 1218 阅读 · 0 评论 -
Dijkstra 算法的 C/C++ 实现
Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,是广度优先算法的一种,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原创 2016-08-28 18:47:59 · 14171 阅读 · 1 评论 -
C++实现最长公共子序列和最长公共子串
转载自:点击打开链接#include "stdafx.h"#include #include using namespace::std;int lcs(string str1, string str2) { int len1 = str1.size(); int len2 = str2.size(); vector> c(len1 + 1, vector(len2转载 2016-07-14 21:36:34 · 20732 阅读 · 0 评论 -
图的广度优先搜索----算法导论
《算法导论》上已经解释的非常清楚了,于是直接照搬过来吧,本文转载自《算法导论》原创 2016-08-15 09:41:06 · 551 阅读 · 0 评论 -
图的深度优先搜索----算法导论
《算法导论》上已经解释的非常清楚了,于是直接照搬过来吧,本文转载自《算法导论》原创 2016-08-15 10:17:59 · 512 阅读 · 0 评论 -
最小生成树----算法导论
《算法导论》上已经解释的非常清楚了,于是直接照搬过来吧,本文转载自《算法导论》转载 2016-09-06 11:42:26 · 1093 阅读 · 0 评论 -
排序--希尔排序
希尔排序的时间复制度为 O(n ^ (3 / 2))C# 版// c.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"void ShellSort(int * arr, int length){ int increament = length ; do { increament = increament / 3 + 1 ; for原创 2016-06-06 15:17:19 · 308 阅读 · 0 评论 -
二叉树的非递归遍历
二叉树的非递归遍历二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.转载 2016-08-29 14:45:08 · 626 阅读 · 0 评论 -
KMP 算法的数学推导
不论从逻辑上怎么分析KMP算法,只要不给出具体的数学公式,都是不严谨的,直到看了KMP算法的数学公式,我才真正理解了该算法。 假设有一个待匹配的源字符串S,其数学表达式如下: 接下来我们还有一个模式字符串t,其数学表达式如下: 假设存在整数 I 和 j(0 ------原创 2016-07-21 10:57:05 · 2535 阅读 · 2 评论 -
排序--散列查找
class HashTable{#define HASHSIZE 12#define NULLKEY -32768private: typedef struct{ int* elem; int count; }_hash_table; int m = 0 ;public: bool InitHashTable(_hash_table* h) { int i;原创 2016-06-24 09:41:03 · 400 阅读 · 0 评论 -
排序--冒泡排序
C# 版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BubbleSort_CSharp{ class Program { static void Mai原创 2016-06-01 17:01:40 · 432 阅读 · 0 评论 -
排序--选择排序
选择排序的时间复杂度是O(n),虽然选择排序的时间复杂度依然是O(n),但是选择排序交换和移动数据的次数比冒泡少,性能上要强于冒泡排序。C#版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespac原创 2016-06-02 16:15:13 · 352 阅读 · 0 评论 -
排序--直接插入排序
直接插入排序的时间复杂度是O(n),就像打地主时理牌一样,一点一点的挪,性能要好于冒泡和选择排序C# 版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CSharp{原创 2016-06-03 15:19:34 · 405 阅读 · 0 评论 -
排序--快速排序
快速排序的时间复杂度:O( nlogn ) C# 版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace QuickSort{ class Program {原创 2016-06-12 17:35:08 · 415 阅读 · 0 评论 -
动态规划--钢条切割
朴素递归:/* 朴素递归算法,计算当钢条长度为 n 时,计算最大收益 输入参数: p:价格数组,长度为 i 的钢条的价格为 p[i] n:钢条长度 返回值: 最大收益*/CUT-ROD( p, n ) if n == 0 // 递归结束的条件:钢条的长度为 0 return 0 q = -1 // 初始化价格为 0 for i = 1 to n //原创 2016-07-12 10:30:56 · 617 阅读 · 0 评论 -
Top K 算法详解
转载自:点击打开链接应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1转载 2016-07-26 10:25:47 · 848 阅读 · 0 评论 -
C++ 实现 0-1 背包问题
1.什么是动态规划首先介绍一下动态规划...设计一个动态规划算法,通常可按照以下几个步骤进行:(1) 找出最优解的性质,并刻画其结构特征。(2) 递归地定义最优解的值(3) 以自底而上的方式计算出最优值(4) 根据计算最优值时得到的信息,构造一个最优解。对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。原创 2016-07-15 10:59:28 · 23463 阅读 · 7 评论 -
查找--二分查找
二分查找的前提是线性表中的记录必须是有序的,线性表必须采用顺序存储。二分查找的基本思想是:1.在有序表中,取中间记录作为比较对象,若给定值与中间记录的值相等,则查找成功;2.若给定值小于中间记录的值,则在中间记录的左半区继续查找;3.若给定值大于中间记录的值,则在中间记录的右半区继续查找;二分查找的时间复杂度是:O(logn)C 版// binary s原创 2016-06-23 15:41:46 · 387 阅读 · 0 评论 -
查找--插值查找
二分查找每次都是从中间开始,没有考虑数据之间的关系,这是一种比较低效的实现方法,插值查找就是在二分查找的基础上,改进的中间记录的选取。虽然插值查找的时间复杂度月二分查找相同,都是 O(logn),但是对于表比较大,而关键字分布比较均匀的查找,插值算法的平均性能比折半查找要好很多。反之,线性表中记录分布不均匀,用插值查找未必是很好的选择。C 版// interpolation s原创 2016-06-23 15:50:48 · 1846 阅读 · 0 评论 -
扑克牌顺子
扑克牌顺子参与人数:2032时间限制:1秒空间限制:32768K本题知识点: 字符串 算法知识视频讲解题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方原创 2016-06-21 22:16:01 · 466 阅读 · 0 评论 -
排序--堆排序
堆排序的时间复杂度是 O( nlogn ) ,由于是跳跃式的排序,所以堆排序属于不稳定排序。C# 版using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CSharp{ class原创 2016-06-06 16:52:08 · 263 阅读 · 0 评论