数据结构
文章平均质量分 68
s_h_r
这个作者很懒,什么都没留下…
展开
-
POJ 2002 Squares (Hash)
题意:给你二维平面点集 让你找出其中能组成多少个正方形思路:对每一个点进行哈希 枚举两个点做为正方形的一条边 然后再求另外两个点 看看原点集中是否存在这两个点 由于枚举的是每条边 则一个正方形会被枚举四次 结果要除以四#include #include using namespace std;#define REP( i, a, b ) for( int i = a; i < b;原创 2015-06-16 13:10:00 · 386 阅读 · 0 评论 -
归并排序 C++实现
归并排序是众多排序算法中的一种,它采用分治递归的方法,时间复杂度为O(nlogn),空间复杂度为O(n)。基本思想是首先将整个区间分成两部分,分别对其进行求解,再对这两部分再次分解,直到区间分得足够小的时候进行计算,最终再合并。#include <cstdio>#include <cstring>using namespace std;void Merge(int *arry, int left原创 2016-03-12 10:28:57 · 441 阅读 · 0 评论 -
快速排序C++实现
快速排序采用分治递归法,将问题分解为一个个小的问题,再递归求之。 大致思想为: 首先对于一个区间L,R,找到一个元素p,将所有大于p的元素全部移动到p的右边,所有小于p的元素全部移动到p的左边,这样就大致将顺序整理了一下,然后对于p左边的区间L1,R1,递归上述方法,右区间同理。#include <cstdio>using namespace std;void QuickSort(int *a原创 2016-03-10 22:10:46 · 347 阅读 · 0 评论 -
二叉树的递归与非递归遍历实现
参阅资料:http://blog.csdn.net/ns_code/article/details/12977901 二叉树是很常见的数据结构, 它的遍历方式有递归和非递归两种,其中递归方式易于实现,而非递归的方式往往效率更高,耗资源更少,各有千秋,下面就来介绍下具体的实现方法。节点结构:typedef struct Node{ int val; Node* left; N原创 2016-03-06 20:44:01 · 492 阅读 · 0 评论 -
二叉搜索树(BST)递归与非递归的插入、删除、查找的实现
昨天碰到了二叉搜索树(BST)这种数据结构,索性详细的学习了一遍。BST的定义: 如果一棵树的左子树不为空,那么其所有节点的值均小于其根结点的值,如果右子树不为空,那么其所有节点的值均大于其根结点的值,它的左右子树也满足如上性质。空树也是BST。我的BST的实现是以没有重复元素为前提,其实有重复元素也无大碍,只是把实现过程中相关的<改成<=即可,节点结构定义:class Node{pub原创 2016-03-03 18:06:40 · 7017 阅读 · 1 评论 -
2015沈阳赛区网络赛 HDU 5457 Hold Your Hand 字典树+最小割
题意:给你n个十进制数和m个二进制字符串的前缀或后缀,每一个都有一个花费,一个数可以被它的二进制前缀或后缀消除,问你最小的花费使得所有数消除,无解输出-1。思路:将这n个数的二进制正着反着建到两个字典树上,每个节点值为INF,然后对于每一个二进制字符串,更新其最底下的节点的值,把两棵树连起来在字典树上跑最小割。这个题代码很low,为了防止000和0000重复同一个值,我用的map,而正反0000也是原创 2015-09-22 22:14:32 · 848 阅读 · 0 评论 -
UVALive 7043 International Collegiate Routing Contest 字典树
题意:给你一些子网 让你计算出最少的子网数 使得两者的并集为所有的ip地址 并且二者没有交集思路:貌似只要有关ip地址的都要上字典树... 对于每一个输入的网段 我们将其转化为二进制形式并保存在Trie树中 如果存储到子网掩码的最后一位 则将其接下来链接的0和1用一个特殊的标记标记上 代表从这往后地址都属于我这一网段的子网地址 然后查询那些没有被“堵住”的地址 如何查询呢 我用的是动态分配的写原创 2015-09-03 21:15:41 · 898 阅读 · 0 评论 -
第六届山东省赛I题 Routing Table 字典树 NEU 1588 & UPC 3116 & SDUT 3259
最近一直没刷题 主要是快要网络考试了 一直在准备考试 当看到CIDR记法分配IP地址时 突然想到省赛这道题 如果懂点CIDR无分类编址的话 这道题还算比较好做 可惜当时并不懂 于是省赛上没做出来 主要思路就是把它给你的IP地址转化为二进制 保存在Trie树中 然后在网络前缀的最后一位保存IP地址的网络前缀位数和端口号 对于每一个目的IP地址 从第一位开始匹配 如果匹配 就更新信息 否则退出 一开始原创 2015-06-26 14:02:00 · 734 阅读 · 0 评论 -
UVA 1401 & LA 3942 Remember the Word 字典树+DP
题意:给你一个字符串 再给你若干单词 问你这些单词有多少种组合方式可以组合成所给的字符串思路:不难想到递推方程 dp[i] = sum(dp[i+len(x)]|x是从i开始的字符串的前缀单词) 问题便转化为了求一个单词是否是一个字符串的前缀 如果按照朴素做法 对于每一个子串都要枚举每一个单词 时间复杂度为3×10^5×4000×100 必然要T 如果我们将单词存储到字典树里 对每个子串的查原创 2015-06-19 15:02:54 · 516 阅读 · 0 评论 -
POJ 1816 Wild Words 字典树+DFS
题意:给你一些模板串 再给你一些匹配串 问你每个匹配串分别能被那些模板串匹配思路:由于模板串有100000个 所以一个一个匹配会超时 我们可以用字典树将这些模板串储存下来 查询时就会减少相同前缀的查找次数 然后就是暴搜了#include #include #include #include using namespace std;#define REP( i, a, b ) f原创 2015-06-20 17:11:54 · 416 阅读 · 0 评论 -
HDU 1251 字典树
题意:中文题。。。问你某个单词是多少单词的前缀思路:很裸的字典树。。。人生第一次用。。。#include #include using namespace std;#define REP( i, a, b ) for( int i = a; i < b; i++ )struct Trie{ int va; Trie *next[26];原创 2015-06-18 21:06:45 · 367 阅读 · 0 评论 -
HDU 1671 Phone List 字典树
题意:给你一堆数字串 问你其中是否有一个串是另一个串的前缀思路:又是一道裸的字典树。。。对于每一个数字串 先判断是否是其它字符串的前缀或者它是别的字符串的前缀 如果是 后面就不用再判断了 如果不是 就把这个串存入字典树中 继续下面的判断#include #include using namespace std;#define REP( i, a, b ) for( int i =原创 2015-06-18 22:10:43 · 386 阅读 · 0 评论 -
HDU 1800 Flying to the Mars 字符串哈希||字典树||map
题意:给你n个队员的等级 高等级的可以教低等级的骑扫把 每个人最多只能有一个老师和一个徒弟 如果两个人构成师徒关系 那么这两个人可以公用一个扫把 问你最少需要几个扫把思路:手动模拟一下会发现 最少需要几把扫把 取决于同等级人数的最大的那个 于是问题转化成求一个集合里重复出现次数最多的那个等级的次数 据说这题可以用map水过 但要看rp 还有什么字典树什么的也可以搞 但渣渣目前还不会.... 只原创 2015-06-17 16:13:38 · 561 阅读 · 0 评论 -
UVA 1152 4 Values whose Sum is 0 (hash)
题意:给你4组数 每组数都含有相同个数的元素 分别从每组数中选一个数 问你有多少种方案使得它们的和为零思路:枚举前两组数的所有和 并将它们存入哈希表中 然后再枚举后两组数的所有和 判断是否在哈希表中存在#include using namespace std;#define REP( i, a, b ) for( int i = a; i < b; i++ )const int原创 2015-06-16 15:22:26 · 417 阅读 · 0 评论 -
堆排序 C++实现
堆是一种数据结构,实际上是一渴完全二叉树,它满足以下性质: 对于大顶堆而言,其所有的父节点都大于其子节点。基本思想:1、按照下标建立一棵完全二叉树 2、从最后一个非叶子节点开始与其左右孩子比较,将三者最大的点交换为父节点。每个非叶子节点都这样比较,直到根结点。 3、此时根结点一定为最大的节点,将该节点与最后一个节点交换,重复2,直到所有节点都完成上述操作为止。具体实现:#include <cs原创 2016-03-17 10:15:11 · 463 阅读 · 0 评论