数据结构&算法
每日不忘磨练核心技能
五月的天气
承认平凡 不甘平凡
展开
-
汉明权重(hamming weight) ----- 计算数据位中1的个数
汉明重量是一串符号中非零符号的个数。因此它等同于同样长度的全零符号串的汉明距离(在信息论中,两个等长字符串之间的汉明距离,是两个字符串对应位置的不同字符的个数)。在最为常见的数据位符号串中,它是1的个数。本文参考文章1 文章2在wiki百科中给出,计算1的个数,目前来说最好的是按照树状进行相加(当然比遍历要快很多,遍历就相当于一棵极不平衡的数)下面是variable-precision SWAR算法的实现:uint32_ t swar (uint32_ t i) { //步骤1 .原创 2020-12-26 12:24:33 · 3780 阅读 · 0 评论 -
C++二分查找法改进版
这里针对数组中有多个重复元素对二分查找法进行了如下的改进floor函数:在arr中寻找target,如果存在,则返回target的最小索引,如果不存在,则返回比target小的那个值的最大索引 ,如果target比arr中最小的元素都还要小,则说明target不在数组arr中,则返回-1ceil函数:/在arr中寻找target,如果存在,则返回target的最大索引,如果不存在,则返回比ta...原创 2019-04-21 17:57:35 · 361 阅读 · 0 评论 -
c++递归和非递归实现二分查找法并比较其性能
#include<iostream>#include<cassert>#include<ctime>using namespace std;//数组必须是有序的//如果找到target,返回相应的索引index//如果找不到,返回-1template<typename T>int binarySearch(T arr[], int...原创 2019-04-21 17:29:58 · 715 阅读 · 0 评论 -
《数据结构》严蔚敏 习题10.32 荷兰国旗问题
这道题我是用快速排序来做的,将原数组分为三部分来思考问题我一直参考的一份答案,发现他的思路其实和我是一样的:https://www.cnblogs.com/kangjianwei101/p/5609105.html即当等于2的时候不动,继续扫描,大于2的时候就进行一个交换#include<stdio.h>//荷兰原创 2019-03-31 10:14:55 · 575 阅读 · 0 评论 -
《数据结构》严蔚敏 习题集10.31解答
这道题我特别偷懒的用了一个辅助数组,然后从前到后扫描一边辅助数组,将小于0和大于0的,分别放到原数组的两头,这样的实现算是一个变相的归并了吧,哈哈。这道题显然归并和快排都可以做,因为其只需找到一次位置就可以。#include<stdio.h>//快排,归并都可以//不过快排好像还要找一下0,这就要循环一遍,时间复杂度为n了//按归并来写吧. 不顾归并有一个将元素复制到辅助数组...原创 2019-03-31 09:14:11 · 219 阅读 · 0 评论 -
严蔚敏数据结构习题10.30
这个快排的话,说实话,之前一直写的都是递归形式的快排,对待非递归的快排,也就是自己要维护一个栈,所以觉得挺有意义的,单开一个博文,记录一下。先把我之前的递归形式的快排放上来,当然这个也是做了优化的快排,并没有每一次都把轴心元素和找到的元素交换,而是先通过low和high所指的元素之间的相互赋值,从而找到轴心元素应该所在的位置,从而直接一个赋值即可。具体的步骤如下:这里的话,将a[low]看...原创 2019-03-31 08:35:57 · 592 阅读 · 0 评论 -
严蔚敏数据结构10.24习题
2路插入排序的思想就是利用循环数组,增加一个辅助数组用来插入排序。将小的数字插入在左边,将大的数字插入在右边详情可以见这个博客,我觉得写得很好:http://data.biancheng.net/view/67.html#include<stdio.h>void _2_sort(int arr[],int aux[],int n){ int i,j; int head,...原创 2019-03-25 12:56:01 · 124 阅读 · 0 评论 -
插入排序自己遇到过的一些坑
哎,说到底还是很伤心的,最简单的直接插入排序我都写不好,555…今天夜晚写了一个错的插入排序,觉得有必要记录下来void insertsort(int arr[],int n){ int i,j; for(i = 1;i<n;i++) { int e = arr[i]; //为当前要插入元素保存副本 for(j = i-1;j >= 0 ;j--) //与i的...原创 2019-03-25 09:59:00 · 513 阅读 · 0 评论 -
归并排序优化之通过自底向上来完成归并排序
我们大家应该都知道归并排序最简单想到的就是自顶向下,采用递归的方法逐步分解为logn层,然后,对每一层采用归并排序,每一层的时间复杂度为O(n),所以归并排序是时间复杂度为O(nlogn)的一种有效的排序方法。那下面我们就来学习一下归并排序的一种优化——自底向上来完成归并排序PS:我们这里都是默认由小到大排序自底向上归并排序过程我们这里就可以化递归为迭代,来实现算法tmplate &amp;lt...原创 2019-03-17 17:05:34 · 1127 阅读 · 2 评论 -
严蔚敏《数据结构》第五章习题5.5-5.8题
5.5题5.6题原创 2019-03-15 19:59:23 · 1531 阅读 · 0 评论 -
c++实现二分搜索树的插入和查找利用二分搜索树的查找来实现对圣经中词频统计
这个是我实现的二分搜索树的插入和查找#include<iostream>using namespace std; //不要忘记template<typename Key , typename Value>class BST{private: struct Node { Key key; Value value; Node* left; N...原创 2019-04-22 20:11:22 · 309 阅读 · 0 评论 -
c语言实现找出数组中出现次数最多的元素
这道题的来源是一年的统考考研数据结构题,我还找了半天,没找到是哪一年的。然后这个的话,我看了一下答案感觉他那个思路不是很好理解,然后我就看到了这个思路,发现思路得很好,值的积累。原创 2019-04-15 10:45:15 · 22708 阅读 · 8 评论 -
c++实现二叉搜索树的前中后序遍历和层序遍历
前中后序遍历都挺简单的,用循环来实现的话要注意三条语句的次序。另外,层序遍历的话,需要我们引入一个队列,他要求我们每次将根节点先入队,然后将根节点弹出,然后依次再将这个根节点的左右孩子的结点分别入队,然后弹出左孩子,将左孩子的左右孩子入队,然后弹出队列中的队首元素(也就是之前的右孩子),将右孩子的左右孩子入队。。。 以此类推,直到弹出的队首元素没有左右孩子。void PreOrder(Node*...原创 2019-04-22 20:50:13 · 518 阅读 · 0 评论 -
二叉树的先序遍历,中序遍历,后序遍历的非递归C语言实现
我觉得这篇文章写的很好,所以转一下,原地址为这里后序遍历后序遍历要求左右子树均完成后才对自身进行访问。入栈时,先将右子树(若存在)入栈再将左子树(若存在)入栈,然后指向左孩子(若存在左孩子,否则指向右孩子)。在对这个部分结点构成的栈进行出栈操作时,应该注意到两个特点。第一、叶结点,他是左右子树均为空,而跳出循环时,从栈顶推出。第二、任一结点出栈后,考察他和栈顶结点的关系,若是双亲关系,则说明下...转载 2019-05-14 13:41:42 · 1035 阅读 · 0 评论 -
c语言设计一个递归算法,删除不带头结点的单链表L中所有值为x的节点
之前我有写过这个的答案,但是当时真的是太navie,无知者无畏啊,我竟然因为此来怀疑c语言对链表不能实行递归,归结原因是我对递归了解的不够透彻,今天重新学习了一下递归,也就重新编写了一下代码。同时这也是leetcode上面203题的答案(当然用递归的话,时间复杂度会高,所以时间会长一点,如果用迭代的话会好很多)delete_x.h#ifndef _DELETE_H_#define _D...原创 2019-04-30 19:47:21 · 14475 阅读 · 8 评论 -
c++实现堆排序(由小到大)
这里实现了两种堆排序算法第一种是:将n个元素逐个插入到一个空堆中,算法复杂度为O(nlogn)第二种是:从第一个不是叶子节点的元素开始调整堆 算法复杂度为O(n)这里还将堆排序和三路快排,归并排序做了一个比较结果如下:main.cpp#include <iostream>#include "SortTestHelper.h"#include "Heap.h"#inc...原创 2019-04-20 11:41:13 · 1503 阅读 · 0 评论 -
c语言实现最大堆
以我实现的经验来看,还是快点学会c++吧,c语言来写的话,太复杂了。。。注意点我都标记在了代码里,然后,想提醒自己一下,插入是,调整堆,是循环上移;删除时,调整堆,是循环下移这里由于初次学习,就先将二叉堆不打印成树的形状,只是以数组的形式输出,等进阶了,再来思考一下//c语言实现一个最大堆. 堆从数组的下标为1的部分开始存储//写的时候不得不感叹,还是c++强大啊,真的更安全了#incl...原创 2019-04-20 10:59:41 · 1928 阅读 · 0 评论 -
c++并查集优化(基于size和rank)
基于size的优化是指:当我们在指定由谁连接谁的时候,size数组维护的是当前集合中元素的个数,让数据少的指向数据多的集合中基于rank的优化是指:当我们在指定由谁连接谁的时候,rank数组维护的是当前集合中树的高度,让高度低的集合指向高度高的集合运行时间是差不多的:基于size的代码: UnionFind3.h#ifndef UNION_FIND3_H_#define UNION_F...原创 2019-04-23 12:10:10 · 873 阅读 · 0 评论 -
c++ 实现用邻接表和邻接矩阵来存储图
这里借助了c++的容器vector来存储每一个结点以及信息这里我们的稀疏图用邻接表来存储会更好一点稠密图的话用邻接矩阵来存储会更好一点稠密图的邻接矩阵的实现#ifndef DENSEGRAPH_MY_H_#define DENSEGRAPH_MY_H_#include<iostream>#include<vector>#include<cassert...原创 2019-04-27 18:18:16 · 1695 阅读 · 0 评论 -
c++实现并查集 并进行优化(一)
我们首先实现的版本一的并查集,用数组实现,在Union(p,q)的操作中,我们遍历一遍数组,将值和p相同的元素的值都改为q所对应的值。这样的话,我们的Union操作实际上时间复杂度是O(n)版本二中,我们将在Union(p,q)的操作中,找到p和q的根节点,让其中一个的根结点指向另一个元素的根节点即可(指向根节点的原因是我们想尽量减少树的高度,从而在查找的时候效率更高。)在测试10000 和...原创 2019-04-23 10:41:43 · 323 阅读 · 0 评论 -
严蔚敏《数据结构》第五章习题5.3题——多维数组的两种存储方式(左下标优先和右下标优先)
关于多维数组存储的两种方式详情见这个博客:https://blog.csdn.net/misskissC/article/details/14520297(讲的很好的啦)那么关于这一题按高下标优先存储方式(以最右的下标为主序),顺序列出数组A2×2×3×3中所有元素aijkl,为了简化表达,可以只列出(i,j,k,l)的序列。我们分别用按高下标优先和低下标优先存储方式来做一下最右下标存...原创 2019-03-15 16:59:45 · 4958 阅读 · 3 评论 -
《数据结构》严蔚敏 数组的顺序存储结构
数组顺序存储原创 2019-03-15 09:33:58 · 1526 阅读 · 0 评论 -
《数据结构》严蔚敏 用栈实现进制转换
基本思想很简单原数:NN = (N div d) X d + N mod d//Order Stack//apply of stack --- conversion of number systems#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKIN...原创 2019-01-06 10:21:04 · 1117 阅读 · 0 评论 -
《数据结构》严蔚敏 3.1 栈
It’s enough easy,so I complete it smoothly.Well,This morning I meet a handsome and nice Philadelphia boy,May be It’s also a catalyst~the screenshot of result//Order Stack#include<stdio.h>...原创 2019-01-06 09:32:37 · 416 阅读 · 0 评论 -
《数据结构》严蔚敏 离散时间模拟——银行排队 算法3_6 - 3_7
这个是借鉴了一下别人的代码的。原文:https://www.cnblogs.com/kangjianwei101/p/5225738.html(膜大佬)这个问题综合性很高,把队列和链表的知识都照顾到了诶。学习一下~还是先放截图吧3.6.h#ifndef _3_6_H#define _3_6_H#include<stdio.h>#include<stdlib...原创 2019-01-11 09:06:21 · 891 阅读 · 0 评论 -
《数据结构》严蔚敏 算法2.1代码实现
题目要求实现: A= AUB原创 2019-01-01 14:02:16 · 1435 阅读 · 0 评论 -
《数据结构题集》2.12
核心代码:int common_prefix(List LA,List LB) //找到最大前缀的下标int compare(List LA,List LB,int prefix) //然后进行比较int common_prefix(List LA,List LB){ int i; int j = 0; int length; length = ( ...原创 2019-01-04 16:00:22 · 354 阅读 · 0 评论 -
《数据结构题集》严蔚敏 2.10
有效代码:int Delete(List *L,int i,int k)intDelete(List *L,int i,int k){ int j = 1; if(i<1 || i>(*L).length || k<0 || i+k-1>(*L).length) return ERROR; for(int count = 0; count < k;c...原创 2019-01-04 15:01:17 · 696 阅读 · 0 评论 -
《数据结构题集》严蔚敏 2.11
有效代码: int InsertListOrder(List * L,int e);int InsertListOrder(List * L,int e){ int * newbase; int i; if( (*L).length > (*L).size) { newbase = (int *)realloc((*L).elem, (LISTINCREMENT + (*L...原创 2019-01-04 14:41:59 · 700 阅读 · 0 评论 -
《数据结构》严蔚敏 算法2.22
用链表实现两个多项式相加#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef ...原创 2019-01-03 17:11:36 · 693 阅读 · 0 评论 -
C语言实现双向链表(navie版本)
一直以来以为自己知道双向链表,不就是每个节点都有两个指针,分别指向前驱和后继吗~错❌❌❌,大大的错。今天实现进程的就绪队列的时候,才发现自己数据结构的知识如此薄弱。头节点和尾节点这两个成员是固定不变的,它们是链表固定的两个入口。新插入的结点不会替代它们的位置,只是会插入在 head和 tail之间。就像火车一样,两头的火车头是不变的,要增加车厢,只是往中间加。而我们的第一个元素也不是头节点...原创 2018-12-09 17:04:03 · 3642 阅读 · 0 评论 -
《数据结构》严蔚敏 用栈实现括号匹配检验
思路:将符合要求的符号"[“和”(“添加到栈中,然后将每一次输入的”]“和”)"与栈顶元素利用ascii码值来进行比较,如果匹配则将栈中压入的元素弹出,否则继续匹配下一个。当输入结束符“#”时,若栈为空,则匹配成功,否则,匹配失败核心代码:int match(char p,char q)void parenthesis_matching(SqStack * S)程序截图://Order...原创 2019-01-06 11:54:19 · 3387 阅读 · 0 评论 -
《数据结构》严蔚敏 用栈实现行编辑程序
参考文章:https://blog.csdn.net/Vit_rose/article/details/52781086//order stack//接受用户输入在缓冲区中,用户发现输入错误的时候,可以补一个退格符"#",“@”退行符//input: whli# #ilr#e(s# *s)// outcha@putchar(* s= # ++);//output: wh...原创 2019-01-06 15:42:49 · 934 阅读 · 1 评论 -
《数据结构》严蔚敏 顺序存储实现循环队列 算法3_4_3
我第一次实现的时候竟然是用链表实现的。。。哎,这种zz的事,就莫再提了,转载文章:https://blog.csdn.net/Vit_rose/article/details/52781124其实和前面顺序栈差不多,但是就是在判断指针的下一个位置的时候q->rear = (q->rear+1)%MAXQSIZE;q->front = (q->front+1)%MAXQ...转载 2019-01-09 10:22:29 · 248 阅读 · 0 评论 -
《数据结构》严蔚敏 链式存储实现队列 算法3_4_2
这个用链表代替数组来实现队列原创 2019-01-09 08:54:31 · 169 阅读 · 0 评论 -
《数据结构》严蔚敏 顺序存储实现队列 算法3_4_1
这个的实现和前面的栈大同小异,就不多叙述了// queue//除了这种还有双端队列#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define INIT_SIZE 100#define INCRESMENT 10typedef int ElemType;typedef...原创 2019-01-08 21:09:57 · 243 阅读 · 0 评论 -
递归转非递归
今天在做题的时候,遇到的这么一个问题,觉得很有意思。在这里先简单的记录一下。好文章:https://www.cnblogs.com/bakari/p/5349383.html能用递归解决的问题,必须满足以下两个条件:一个问题能够分解成规模更小,且与原问题有着相同解的问题;存在一个能让递归调用退出的简单出口。 存在一个能让递归调用退出的简单出口。用递归实现判断回文串#include&...原创 2019-01-13 09:46:09 · 1924 阅读 · 0 评论 -
数据结构》严蔚敏 串的ADT实现 用堆串存储 算法4.4
跟前面的线性存储是一个道理的,本质上还是顺序存储,只不过用了堆来动态分配,使串的长度不受限制,更加灵活借用大佬一张图:4_4.h#ifndef _4_4_H#define _4_4_H#include<stdio.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERRO...原创 2019-01-12 20:28:49 · 507 阅读 · 0 评论 -
《数据结构》严蔚敏 用栈实现递归来解决hanoi问题
//hanoi problem#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;string.h&amp;gt;int times = 1;voidmove(char from,int n,char to){ printf(&quot;%d times: Move d原创 2019-01-07 18:14:08 · 514 阅读 · 0 评论 -
《数据结构》严蔚敏串的ADT实现 算法4.1
这个没有借助C语言的库函数,而是自己写了一下字符串操作函数.测试用例有点水,将就着看吧。。。附上c语言字符串操作函数// strcpy(p, p1) 复制字符串// strncpy(p, p1, n) 复制指定长度字符串// strcat(p, p1) 附加字符串// strncat(p, p1, n) 附加指定长度字符串// strlen§ 取字符串长度// strcmp(p,...原创 2019-01-12 12:17:45 · 573 阅读 · 0 评论