数据结构与算法
文章平均质量分 77
攻城狮凌风
专业吹水,从不装B
展开
-
为什么处理有序数组比无序数组快?
于某些怪异的原因,下面这段C++代码表现的异乎寻常—-当这段代码作用于有序数据时其速度可以提高将近6倍,这真是令人惊奇。123456789101112131415161718192021222转载 2014-06-08 10:56:01 · 924 阅读 · 0 评论 -
数据结构相关概念
1.算法设计的目标: 可行性,可读性,健壮性,高效率,低存储。算法的一般特点:有穷性,确定性(无二义),可行性(由基本运算的有限次实现)。 2.数据的物理结构:顺序存储物理连续,存储密度高,可以随机访问数据。但是不利于数据插入删除。链式存储存储密度低,但是便于数据操作。另外还有散列,索引 3.实参初始化从左到右,因此默认形参值必须从右到左定义 4.对原创 2015-05-09 21:31:35 · 563 阅读 · 0 评论 -
每天一道算法题(34)——背包问题
1.0-1背包问题 有N件物品和一个能装质量为W的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的总重不超过背包总重,且价值总和最大。这个问题的特点是:每种物品只有一件,可以选择放或者不放。 定义f[i][j]:在前i个物品中用容量为j的包选择所能得到的最大价值。则转移方程:f[i][j]=max{f[i-1][j],f[原创 2015-08-25 21:39:52 · 1457 阅读 · 0 评论 -
总结各种容器特点
(1) vector内部数据结构:数组。随机访问每个元素,所需要的时间为常量。在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity原创 2015-08-04 11:14:22 · 791 阅读 · 0 评论 -
顶点间最短路径长度之探寻算法
1.最短路径概念 在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。 对于带权的图,考原创 2015-06-10 21:48:50 · 1441 阅读 · 0 评论 -
最小生成树
最小生成树: 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的无回路子集,使得的 w(T) 最小,且包含了全部顶点。则此T 为 G 的最小生成树。 最小生成树其实是最小权重生成树的简称。生成树和最小生成树有许多重要的应用。例如:要在n个城市之间铺设光原创 2015-06-09 17:50:39 · 625 阅读 · 0 评论 -
每天一道算法题(36)——8皇后问题
题目 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。求一种解法。思路 (1)递归法。以列数为状态,每一行的棋子共有8种状态。对每一棋子,依次遍历8种状态,在符合规则的状态下进行递归。 (2)深度有线遍历法。类似于递归法,对于每一层棋子,倘若符合规则,则前进;不符合规则且状态原创 2015-09-09 22:21:59 · 1225 阅读 · 0 评论 -
每天一道算法题(40)——组成的最小数字
题目: 输入10个数,表示0-9对应的个数,输出用所有的这些数组成的最大数字。注意‘0’不能在开头代码:# include #include"string"using namespace std;int main(){ static int counter[10];//设置计数器 int i; for(i=0;i<10;i++) cin>>counter[i原创 2015-11-04 22:56:38 · 2814 阅读 · 1 评论 -
Bitmap算法
1.用途 处理海量数据,如: (1)已知某个文件内包含100万个电话号码,每个号码为8位数字,统计不同号码的个数。 (2)2.5亿个整数中找出没有出现重复的整数的个数,辅助内存空间不足以容纳这2.5亿个整数。 2.思想 一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采原创 2015-11-06 15:46:58 · 734 阅读 · 0 评论 -
排序法汇总
1.基本概念 主关键字唯一区分不同数据,否则为次关键字。主关键字排序具有唯一性,次关键字否。若相同次关键字的元素排序可能发生交换顺序,则称算法不稳定。常用排序算法优劣衡量指标: ❶时间性能好。即较少的关键字比较次数和元素移动次数。 ❷空间性能好。即辅助缓存小。 ❸稳定性。即相同次关键字元素,排序前后相对位置恒定2.排序方法汇总2.1直接原创 2015-03-18 17:36:56 · 664 阅读 · 0 评论 -
KMP字符串匹配
1.Knuth-Morris-Pratt算法 简称KMP算法原创 2014-10-01 17:34:59 · 773 阅读 · 0 评论 -
每天一道算法题(39)——含有重复字符的全排列
思路(1)对于含有重复字符的全排列必须使用isSwap函数(2)整体思路 a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下) b,子字符串位置后移(i+1-----n)。递归处理子字符串 c,将a中的交换复原。代码#include #include"string"using name原创 2015-11-02 13:02:01 · 1400 阅读 · 0 评论 -
若干快速算法总结
1.快速开方1.1 二分法假定中值为最终解,定义下限为0,上限为x,然后求中值;然后比较中值的平方和x的大小,并根据大小修改下限或者上限;重新计算中值,开始新的循环,直到前后两次中值的距离小于给定的精度为止。需要注意的一点是,如果x小于1,将上限置为1。缺点:收敛过慢。float SqrtByBisection(float n){ float low,up,mid,last...原创 2018-12-09 17:31:37 · 401 阅读 · 0 评论 -
二叉树(4)非递归法遍历二叉树
首先递归法是操作二叉树的首选方法。非递归法ye原创 2014-09-04 20:32:10 · 742 阅读 · 0 评论 -
二叉树(1)已知某2种排序方式,创建这个二叉树并按第3种方式排序
1.关于指针和引用原创 2014-09-01 21:24:46 · 1169 阅读 · 0 评论 -
基于C++任意点数的FFT/IFFT(时域和频域)实现
更改主函数体中的N和length(=log2(N))既可以实现任意点数的FFt / IFFT的实现,fft函数中flag标志位控制是正变换还是逆变换/***************预编译文件头文件complex.h********/#include"iostream"usingnamespace std;/***********************定原创 2014-01-09 10:14:27 · 7445 阅读 · 2 评论 -
二叉树(3):对二叉树数的操作
1.求二叉树见元素差的最大绝对值 假设存储为int,遍历最大原创 2014-09-03 22:01:18 · 774 阅读 · 0 评论 -
算法学习(1)枚举法求运算符
输入ABCDE共5个数,以及结果Result。寻找所有的运算符原创 2014-09-07 21:55:14 · 1279 阅读 · 0 评论 -
二叉树(2)二叉树创建的3种方法,二叉树的递归遍历,二叉树的销毁
1111111原创 2014-09-03 11:34:16 · 4730 阅读 · 0 评论 -
求数组最大数,该数为数组中某两个数相加
题目:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素。。。首先,我们将数组从小到大进行快速排序,1、将最后一个数设为最大数S;2、用第一个数A和倒数第二个数B相加,如果结果比S大,说明B太大了,那么移动为倒数第三个数;如果比S小,说明A太小了,移动为第二个数。如果相等,直接返回A,B3、直到AB的索引相遇还找不到结果与S一样的,原创 2014-09-15 13:32:32 · 1705 阅读 · 0 评论 -
算法设计思想
1.编程的灵魂程序=数据结构+算法+原创 2014-10-08 17:30:48 · 1314 阅读 · 2 评论 -
击败二分查找法——快速检索和插值检索
1.快速检索;最后回归到二分检索的快速检索 如果由于某些原因,数组长度未知,快速检索可以识别初始的搜索域。这个算法从第一个元素开始,一直加倍搜索域的上界,直到这个上界已经大于待查关键字。 之后,根据实现不同,或者采用标准的二分检索查找,或者开始另一轮的快速检索。前者可以保证O(log(n)) 的运行时间,后者则更接近O(n)的运行时间。如果我们要找的元素原创 2014-11-13 11:13:58 · 2109 阅读 · 0 评论 -
字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结
编码和解码可以理解成二进制和字符(广义的字符,包括汉字等)的映射表,编码即从字符映射至二进制,解码则为逆过程。1.英语字符编码ASCII 开始计算机只在美国用。8字节一共可以组合出256(2的8次方)种不同的状态。美国人把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10, 终端就换行,遇上0x0原创 2014-12-18 20:30:11 · 2248 阅读 · 0 评论 -
树的创建与遍历
使用孩子链表表示法表示数组,采用广义表的形式输入:#define ms 5typedef struct node{//数的孩子链表表示法 char data; node* p[ms];}*Tree;void createTree(Tree& tree,char* p){ tree=NULL; Tree stack[ms],currentNode;//stack记录当前层次对应的原创 2015-04-22 22:20:52 · 688 阅读 · 0 评论 -
线性表
1.用数组描述的链表,即称为静态链表,元素为一般定义为含游标的结构体。优点:增删元素时,仅需要改变游标,保留了链表的优点;缺点则失去顺序表的随机读取特点。不便于Java使用(不含指针)。 2.顺序表是一种随机存储结构,即随机访问任意元素的时间均为O(1)。分为两种,一种为使用数组静态分配内存的静态顺序表,一种是用malloc和remalloc动态分配存储空间的的动态表。顺表表插入和删除原创 2015-05-11 10:40:35 · 514 阅读 · 0 评论 -
基于C++求两个数的最大公约数最小公倍数
看下面的一段代码int(int x,int y){ int temp; while(x) {temp=x;x=y%x;y=temp;} } return y; } 这是求x,y最大公约数的代码,那么我们应该怎么理解他的算法精髓呢。原创 2014-02-20 15:12:09 · 2107 阅读 · 0 评论 -
求数组最大子数组
SubArray FindMaxSubArray(int data[],int length)//非递归法计算最大子数组 { int max=data[0]; int low=0,high=0;//初始化 for(int i=1;i {int present_sum=data[i],present_max=data[i];原创 2014-10-20 21:45:37 · 1121 阅读 · 0 评论 -
每天一道算法题41-反转链表
除了使用栈的特性或者另外开辟内存从后往前拷贝,另外有两种方法,分别是递归法和遍历法,其中遍历法更加节省内存,递归法写起来逻辑简单。遍历法用图来表示:递归法用图来表示:详细逻辑可以参考:Java单链表反转 详细过程代码如下:#include "iostream"struct NODE_T{ int data; struct NODE_T* pdata;};...原创 2018-12-11 23:54:44 · 286 阅读 · 0 评论