数据结构 算法相关
文章平均质量分 68
shifuwawa
一介code夫。。。
展开
-
数据结构作业 迷宫问题 模拟 之基础的BFS DFS
题目要求老鼠Pzjay从(1,1)出发,到达右下角(或指定位置)是否有路径(DFS),并求最短路径(BFS),DFS是顺序输出路径的,而BFS是逆序输出的(改成顺序输出EASY,就不改了)。貌似DFS也能求最佳路径,但代码量比较可观,BFS!求最短路径dfs也可以,不过ms麻烦哩狠狠,故而bfs代替之。为何bfs找到的就是最佳路径呢,据leefour讲:因为每次入列的均是上个走过的坐标的最原创 2009-10-05 22:50:00 · 1543 阅读 · 0 评论 -
输出邻接矩阵中经过指定顶点的所有简单回路
废话不说,放码子:#include#include#define bie_tou_zhuan_pzjay_wenzhang false;using namespace std;const int nax=100;bool use[nax];int matrix[nax][nax],path[nax];int v,e;void creat_matrix(){原创 2009-10-20 17:06:00 · 2556 阅读 · 0 评论 -
字符串匹配新秀之Sunday
Sunday算法的大致思想是,以pos表示本次匹配的目标串tar的起始位置,len_m表示模式串的长度,当出现不匹配的时候,看从pos开始长为len_m的一段字串的最后一个字符k是否在模式串中出现过,判断是否出现过是通过从右到左扫描模式串得到的,只要碰到k,记录下其位置i,将pos+i作为新的pos(pos+=i),继续匹配。这就扯出了next数组,不要将这个next数组跟KMP中的数组牵连起来,原创 2010-01-12 23:42:00 · 1290 阅读 · 1 评论 -
pz伯伯的番茄排序
在一个美丽宁静的小村庄王岗里面住着一群善良的村民,他们除了都辛勤侍奉自己家的庄稼地之外各自有额外的小菜园。农民pz伯伯就有这么一个菜园,里面种着各种各样的菜蔬:黄瓜,番茄,芹菜,大白菜,菜花等等等等。pz伯伯最快乐的时光就是闲暇时拿张凳子,坐在菜园一头的小屋前看着一地的宝贝们晒太阳。。。每到收获的季节,pz伯伯就会召集村里的小孩子来,告诉他们说:“孩子们,谁帮我采摘番茄,我就奖励他一个黄瓜,谁能按原创 2009-11-26 11:07:00 · 729 阅读 · 0 评论 -
字典序全排列实现
也有递归实现版本,耗时之大难以接受,给个字典序实现的,也是最人性化的实现方式,ms时间效率依然不敢恭维,有待优化。也是STL算法next_permutation的思想。之前光用STL觉得狠省心,后来负罪感越来越重,于是挑个风和日丽,心情凉爽,性欲冷淡的日子认真看了看模拟实现的方式!留下一笔记录心得。初始是升序的排列(当然,也可以实现为降序)作为当前排列开始,然后依次计算当前排列的下一个字典序排原创 2009-12-19 14:32:00 · 1082 阅读 · 0 评论 -
霍夫曼树 编码
根据小慧JJ的课件完成,用数组存储二叉树,Fun_encrypt_leaf()由叶子开始至根部编码,这个存储编码串时从尾部开始存储,对编码好的字符串进行拷贝时正好倒置过来;fun_encrypt_recursion()从根部开始递归到叶子进行编码;fun_encrypt_onrecurent()非递归无栈从根部到叶子进行编码。思想都很强大,我是码农— —bbb…… #includ原创 2010-04-29 12:25:00 · 1900 阅读 · 0 评论 -
单调队列学习 PKU2823
<br /> 一直以为单调队列是优先队列,2了 — —||||<br /><br />本题利用单调队列,单调队列分为最大列和最小列,也就是分别单调递减和递增。下面以最大列为例说明:<br />我们要保证队列中各个元素大小单调递减(不是不升),各个元素的下标单调递增。这样才能保证队首是最大值,而且更新时队首永远是最大值。因此,需要改造一下队列。让它变成能在两头删除,在队尾插入。<br />为了保证单调性,每次插入的时候,先判断队尾元素,若不大于待插入的元素(注意是最大队),删除(这样才能保证插入的数小于原来尾原创 2010-06-06 14:17:00 · 2353 阅读 · 2 评论 -
POJ 2891 扩展欧几里得
<br />初始写了个很裸很暴力的中国剩余定理,并且不会判-1的条件,眼一闭无耻交了一个,TLE,不是WA真给面子 — —|||<br /><br />看了官方题解,咨询了娃娃师父方知扩展欧几里得方为正解。。。<br />不过迭代求x的时候不加上那个mod a2/GCD(a1,a2) discuss里一组样例测不过,不解。。。<br />题意是说,给一组a[i],r[i],求一个最小的m,满足 for_each(i=0: n) a[i]%m=r[i].即 a[i]*x+r[i]=m,不存在输出-1。原创 2010-06-10 20:54:00 · 2698 阅读 · 4 评论 -
四则运算表达式 栈
<br /><br />要考试了,拿起课本,发现数据结构上以前偷懒一直推迟的几份作业没做,做了一下,当复习了。第一个就是利用栈的四则运算计算表达式,除了课本上的功能,增加了表达式输入判错功能,阶乘和n次方的运算,取模没有加,感兴趣的可自己加,其优先级类型雷同*和/。阶乘比较特殊,因为它是单操作数运算符,那么咱们这里约定,假如你想进行a!运算,那么你需要输入a!1,这算是本程序的语法吧,另外不支持高精,注意阶乘运算容易溢出。<br /><br />#include<iostream>#include<st原创 2010-06-14 10:37:00 · 1981 阅读 · 0 评论 -
平衡二叉树 AVL树
<br /><br />接上篇,这次是内个AV树的作业,各种旋转容易让人头晕,参考严蔚敏教材完成:<br />#include <iostream>#include <pzjay>#inlcude <AVL>#include <cstring>#include <stack>#include <copy_right>using namespace std;#define new pzjaystruct node{ int data; int bf;//平衡因子原创 2010-06-15 00:34:00 · 771 阅读 · 0 评论 -
PKU 1365 Prime Land
<br />内存限制10000k,错看成了1000k,一边骂POJ不厚道一边千方百计缩略mem开支,耽误良久,RE良久。艹<br />素数筛选 + 素因子拆分<br />#include <pzjay_cpy>using pzjay:space std;const int sup =4300;//预留sup个位置,略大于oo范围内生成的实际素数个数const int oo = 40000;bool isp[oo + 10];int prime[sup];int x;int ans原创 2010-08-15 10:41:00 · 1039 阅读 · 0 评论 -
探寻C++最快的读取文件的方案 C++ IO优化
在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。竞赛中读数据的情况最多转载 2010-08-14 09:17:00 · 8836 阅读 · 0 评论 -
字符串 hash算法
【转载自:http://explorers.javaeye.com/blog/698377】常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,原创 2010-09-03 11:20:00 · 11275 阅读 · 1 评论 -
计数给定有向邻接表表示的图的连通分量个数
输入格式为:先输入顶点数,再输入有向边数,然后输入邻接点及权值输入数据形式为:9 60 1 1010 2 1023 4 1033 5 1045 6 1057 8 106该图如下表示: 0 3 7 / / / / | 1 2 4 5原创 2009-10-20 13:43:00 · 1097 阅读 · 2 评论 -
dfs输出邻接表指定长度指定端点的路径
之所以是一条路径,因为无向图可能从某点出发有很多条回归路径,根据输入节点的顺序不同,呢么建好的图就不同,所以路径不是最短的,而是充分体现了深搜的特点:找到一条赶紧就撤。放码子:不准偷转! #include#include#define bie_tou_zhuan_pzjay_wenzhang false;using namespace std;const int原创 2009-10-21 17:13:00 · 832 阅读 · 0 评论 -
数据结构作业多链表操作之寻找公共节点。
题目要求使用时间复杂度为O(m+n+q)的方法将ABC三个顺序非递减链表中的公共元素打印输出,并要求重复元素只输出一次。思路就是利用A(三者任选其一),作为结果链表,第一遍遍历A,将重复元素删除只保留一个,然后分别遍历BC,找到三者公共的元素。最后输出A即可。注意建立链表时要顺序建立!放码子:#includeusing namespace std;#define hoh原创 2009-10-04 23:51:00 · 829 阅读 · 1 评论 -
数据结构作业栈与队列(STL实现)处理字符串之从中部摇摆输出
表被题目吓到,所谓从中部摇摆输出即是将一个字串若长度为奇数,则首先输出中间的字母,然后输出中间前边一个字母,然后输出中间后边一个字母,然后输出中间前边的前边的字母,然后输出中间后边的后边的字母……直到输出完毕;偶数的话直接从中部开始重复上述过程,只不过少了一个输出中间字母的步骤。很像左摇一下,右摇一下,故而得名。for example:abcde 应该输出:cbdae abcd 应该输原创 2009-10-05 12:12:00 · 2032 阅读 · 2 评论 -
数据结构作业串通配符匹配问题
采用顺序结构存储串,编写一个一个实现串通配符匹配的函数,其中通配符只有?,他可以和任意字符匹配,for example:原串:where are you re? 匹配串?re则返回3个匹配。码子如下:#include#includeusing namespace std;int main(){ int k,i,j,lena,lenb; char str[100原创 2009-10-06 12:00:00 · 1802 阅读 · 0 评论 -
数据结构作业稀疏矩阵三元组表示
大意是给两个三元组表示的稀疏矩阵,要求将其相乘结果仍用三元组表示:刚开始被书上的伪代码的一个错误给误导着debug一下午,好不郁闷,晚上才发现!程序实现要求先输入两个三元组的稀疏矩阵,放码子:#include#includeusing namespace std;int sma[6][100],smb[6][100],smc[6][100];int check(int matr原创 2009-10-06 20:46:00 · 2769 阅读 · 0 评论 -
二分搜索树非递归节点计数删除
主要利用栈来代替递归算法,因为目的是计数和删除,所以建立就直接递归带过,然后稍微遍历一次,看是否建立成功。放码子:/*递归算法忒简单,一笔带过:int counter(tree *t){ if(NULL==tree) return 0; return counter(t->left)+counter(t->right);}*/#include#include原创 2009-10-07 10:52:00 · 773 阅读 · 0 评论 -
从指定节点处拆分二叉树
如T,直接上码子:程序中用到了建树函数(不会搞模板,每次都得重新写,5……%>_#include#includeusing namespace std;typedef struct tr{ int data; struct tr *left,*right; }tre,*tree;stackst;tree creat(tree root,int val)原创 2009-10-10 17:36:00 · 1698 阅读 · 0 评论 -
旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
详细见注释乐,放码子:#include"stdafx.h"#include#includeusing namespace std;typedef struct tr{ int data; tr *left,*right;}tre,*tree;//先序是根左右,中序是左根右stackst;tree re_creat(int *pre,int *mid,in原创 2009-10-10 22:52:00 · 1001 阅读 · 0 评论 -
二叉树之查找指定节点所在的层数
指定的节点用节点存储的数据来代表,采用递归的方法先判断当前节点是否是目标节点,若不是则依次查找左子树和右子树:放码子:#include#includeusing namespace std;typedef struct tr{ int data; struct tr *left,*right;}tre,* tree;stackst;tree creat(原创 2009-10-10 12:11:00 · 11603 阅读 · 5 评论 -
旧话重提续,根据后序和中序遍历利用广义表非递归构造二叉树
话说偶一直找不到广义表的用武之地,今天书上一个例题很好将广义表跟二叉树结合到了一起,其实二叉树不就是一个深层的广义表么。怪不得把广义表放在树前边讲。放码子: #includeusing namespace std;const int nax=100;typedef struct tr{ int data,left,right; int label;}btree;原创 2009-10-11 17:49:00 · 1347 阅读 · 1 评论 -
稳定排序之基数排序
奶奶的书给的代码好那啥呃,幸好有百科在。所谓基数排序,就是根据最大数字的位数,来分成单个位数排序,先排个位,后排十位,再……,具体就不多说了,网上都有讲,此法适用于位数少,数量大的数字排序。放码子:#include#include#includeusing namespace std;const int nax=100;int coun[10],len;//对各位数字计数原创 2009-10-14 16:04:00 · 1179 阅读 · 0 评论 -
一段小程序,STL相当牛X才能看懂哦
专供牛人,米有注解#include#include#include#includeusing namespace std;int main(){ vectorv; copy(istream_iterator(cin),istream_iterator(),back_insert_iterator >(v));//接受整型输入,遇到非整型停止 sort(原创 2009-10-12 17:58:00 · 1031 阅读 · 2 评论 -
堆排(大顶堆,小顶堆)
汗,别人都说大小顶堆只是改改大于号的问题,可我的代码从大顶堆只改动大于号调整为小顶堆竟然越界乐,掣肘!!后来几经更改才发现是传参的问题(见代码),看来大顶堆改小顶堆不是¥%…#¥…,亦或是我RP出点问题???搞笑的是代码砖头(C::B)竟然对越界错各种容忍,于是乎平常尽量少用,孰不知越界问题很严重。。放码子:#include//大顶堆using namespace std;void原创 2009-10-15 12:26:00 · 10700 阅读 · 2 评论 -
poj 1308 他四叔么? BFS+模拟
囧,卡了好久好久好久好久呀!这个题就是判断是不是树,先判断基本情况:只有一个根节点;不能出现入度大于1的点;顶点数等于边数加上1;都满足的话再利用BFS判断树的连通性,排除环的情况。#include#include#include#includeusing namespace std;const int nax=1000;int mmax=-1;int a[na原创 2009-10-15 22:54:00 · 747 阅读 · 0 评论 -
二分求两个有序数组第k大的数
<br />#include <iostream>#include <cstring>#include <cmath>#include <ctime>#include <cstdio>#include "windows.h"#include <algorithm>using namespace std;const int sup = 1010;int aryA[sup], aryB[sup];/** 二分法求数组aryA从s1到e1,aryB从s2到e2,第k大的原创 2011-01-07 00:47:00 · 4912 阅读 · 0 评论