随笔分类 - 数据结构
POJ 2513 Trie+并查集+欧拉回路
摘要:自己的代码超时了。。。不应该啊,方法没错哦,明天检查一下吧,网上看到一份不错的代码,不是针对于该题目,而是打印中间过程的方法,很细致,非常有利于debug#include <stdio.h> #include <string.h> //#define DEBUG #ifdef DEBUG #define debug(...) printf( __VA_ARGS__) #else #define debug(...) #endif #define M 530001 #define N 500001 struct trie_node { ...
阅读全文
线段树模板
摘要://线段树的节点//节点包括两部分信息,基本域,和信息域//基本域:左右边界ld,rd. 左右孩子:lc,rc//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值struct Node{ int ld,rd; Node *lc,*rc; int key;};//空树的建立,内含key值的初始化;//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树Node *buildtree(int a,int b){ Node * p=new Node;//给P申请一块内存 p->ld=a; p->rd=b; //{初始化 p->key
阅读全文
合并石子问题 贪心+最大最小堆基本操作
摘要:给定k个序列s1,s2,s3,...,sk,用二路合并方法将k个序列合并为一个。假设将任意两个长度分别为n和m的序列合并为一个需要的代价是m+n-1,设计一个算法来确定合并这些序列的合并为一个的最大代价和最小代价。#include<iostream>using namespace std;void swap(int &a ,int &b){ int temp=a; a=b; b=temp;}//返回数组arr[]的最大值void maxSink(int arr[],int n,int i){ int child; int j=i; while(j<=n/2){
阅读全文
RMQ 线段树实现+DP实现 模板
摘要:线段树能在对数时间内在数组区间上进行更新与查询。 定义线段树在区间[i, j] 上如下: 第一个节点维护着区间 [i, j] 的信息。 if i<j , 那么左孩子维护着区间[i, (i+j)/2] 的信息,右孩子维护着区间[(i+j)/2+1, j] 的信息。 可知 N 个元素的线段树的高度 为 [logN] + 1(只有根节点的树高度为0) . 下面是区间 [0, 9] 的一个线段树: 线段树和堆有一样的结构, 因此如果一个节点编号为 x ,那么左孩子编号为2*x 右孩子编号为2*x+1. 使用线段树解决RMQ问题,关键维护一个数组M[num],num=2^(线段树高度+1). M[
阅读全文
学生管理系统
摘要:"Couse.h"#ifndef COURSE_H#define COURSE_H#include<string>#include<iostream>#include<iomanip>#include<fstream>#include<vector>using namespace std;class Course{private: string courseName; double score; bool isBixiu;public: Course *next; //构造函数 Course(string name
阅读全文
双向链表实现的电话簿管理
摘要:写这个例子其实就是为了复习一下数据结构,摆脱STL,写个小程序而已。指针操作的确容易出现不少bug,改了好几次... ...其实大部分简单的文件管理系统都是这个模式 ,回想起大一时候的大作业... ... 1 #include<fstream> 2 #include<iostream> 3 #include<iomanip> 4 #include<string> 5 #include<cstdlib> 6 7 using namespace std; 8 9 namespace NameRecord{ 10 11 struct fri
阅读全文
DoubleLinkList 双向链表
摘要:双向链表无非在pre函数操作的时候更加简洁,不过增加了空间上的开销...双向链表在insert和remove操作中比单项链表稍微复杂一下,下面给出图解:双向链表图示:由下图可以发现,fence的定义仍然采用第二种定义,即fence指向当前位置的前一位置,实际上双向链表向前寻址也很方便了,两种fence定义也就没什么区别了,不过仍然用第二种定义无非是习惯而已,毕竟写单向链表的时候用的是第二种定义,而双向链表大部分都是基于单向链表的...insert图示即代码://插入insert操作,请结合图解看程序更好理解//关键是褛清指针修改的先后顺序//然后是对特殊情况的处理//有两处特殊处理://第一处
阅读全文
Link节点类的改进——通过构建freelist自行管理内存
摘要:在书中看到一有趣的东西,叫做freeList,无非就是优化Link节点类,是的new Link操作跑的更快 !方法是重载运算符,重新定义new,和delete方法。英文书,原理细节描述不清,我的大致理解是,new操作的时候,要跑到内存中去取一块内存单元,CPU在跑着程序,如果能从较近的地方取内存肯定要比去远的地方要好的多。于是,就采取自行管理链表所需内存的方式,定义一freeList链表,为Link类的静态成员变量,初始值为NULL,表示没有“近内存”。调用new方法的时候,如果freelist不为空,那么就在freelist中取一块内存(近内存),如果为NULL,那么只能调用原new操作符,
阅读全文
基于指针的链表LList
摘要:LList需要注意一点就是fence的重新定义,这无非是方便了insert()操作而已,试想,如果fence还指向当前位置的话,那么进行insert操作的时候,当前位置的地址存储在上一个元素的next中,那么要想拿到上一个元素,对于单项链表必须从表头开始一个一个的移动,so 麻烦 !!!于是重新定义 fence使其指向当前位置的上一位置,这样的话上面的问题就解决了,不过又冒出一新的问题,拿第一个元素的上一个怎么处理啊,简单,加一个head节点即可,代表第0个位置,不存值。两中fence定义的图解如下:原本fence定义:修正后的Fence定义图:Insert解析图,注意指针的改动顺序:remo
阅读全文
基于数组的链表AList
摘要:快考试了,作为数据结构的复习,那么就把代码背打一遍好了,虽然代码很简单,但是把基础打牢固对以后的学习肯定是百益而无一害。正好也练练C++模板和指针以及代码书写的模块化,否则天天写些算法程序,一写就一大坨,乱乱的,养成习惯就悲剧了... ...看一点写一点,考试前补充完这篇博文就OK了本来想写到一片文章中的,代码折叠显示,不过折叠后手机里就看不到了...还是分开写吧《基于数组的链表》AList#include<iostream>using namespace std;template<class Elem>class AList{private: int maxSize;
阅读全文
算法与数据结构(5)——二叉查找树
摘要:由于才疏学浅,平时做题很少建立一棵完整的树。因此觉得二叉查找树又啰嗦又没用,直到今天实验课,让我极度之无语,一个小破题儿差点没整死我... ...于是才决心好好整理一下介个曾经被我藐视过得数据结构... 我打算先从今天的实验课的那道题说起,然后再系统写一棵二叉查找树,也为以后总结各种数的变形打好基础 ~ 实验课的题目是这样的:题目2:给出一个整数序列,请按照顺序建立二叉查找树(BST),然后层次化输出,即先输出根结点,然后是根结点的左孩子、根结点的右孩子,一层一层,从左到右地输出。例:输入顺序为37,24,42,32,7,40,2,42,120。对应的二叉查找树如下所示层次化输出为:37 2.
阅读全文
数据结构与算法(6)——哈希表
摘要:在很多情况下,我们需要实现一个符号表,里面保存我们用到的所有符号。每个符号有一个关键码key(不同符号的关键码也不同),其余部分可能非常庞大。换句话说,符号表应该提供以下操作:Search(T, k):查找关键码k是否在表中Insert(T, x):把x添加到表中Delete(T, x):从表中删除元素x有时也把符号表称为"字典",它最经典的实现方法是哈希表。哈希表的不同设计方法以及解决冲突的方法,我觉得单单看算法书或者数据结构上的书不是很好理解,但是结合具体的题目实例来看,就相当的具体与好理解,哈希表的思想就类似于我们平时用字典查英语单词,没有一个人会从第一页一页一页的去
阅读全文
字典树 POJ2001
摘要:首次认识到Trie树的强大之处!简单易懂,只要对建立一般的树的方法有所了解就OK了。Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。它有3个基本特性: 1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3)每个节点的所有子节点包含的字符都不相同。http://poj.org/problem?id=20011 #includ...
阅读全文
数据结构与算法(4)——并查集
摘要:并查集 维护一些不相交的集合,它是一个集合的集合。每个元素恰好属于一个集合,好比每条鱼装在一个鱼缸里。每个集合S有一个元素作为\集合代表"rep[S],好比每个鱼缸选出一条"鱼王"。并查集提供三种操作:MakeSet(x):建立一个新集合x。x应该不在现有的任何一个集合中出现。Find(S, x):返回x所在集合的代表元素。Union(x, y):把x所在的集合和y所在的集合合并。森林表示法可以用一棵森林表示并查集,森林里的每棵树表示一个集合,树根就是集合的代表元素。一个集合还可以用很多种树表示,只要树中的结点不变,表示的都是同一个集合。合并操作只需要将一棵树的根
阅读全文
数据结构与算法(3)——二叉堆
摘要:#include<iostream>using namespace std;const int HEAP_SIZE = 100;void sink(int fa);void swim(int son);int heap[HEAP_SIZE+1];int hs;//以建立最小堆为例/*****************************************************************///删除堆顶元素 ,利用上游函数调整/*删除最小值(deleteMin) 先用最后一个元素代替根由于这一步会导致根的元素比儿子大,因此需要向下调整。向下调整的方法很简单,就是
阅读全文
算法与数据结构(2)——图的表示法与常用的转化算法
摘要:《图的表示方法》(i)邻接矩阵表示法,如图: 也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;否则为0。可以看出,这种表示法非常简单、直接。但是,在邻接矩阵的所有 个元素中,只有 个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。 同样,对于网络中的权,也可以用类似邻接矩阵的 矩阵表示。只是此时一条弧所对应的元素不再是1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。(ii)关联矩阵表示法 也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。如果一个节点是一条弧的起点,则关联矩阵中对应的元素为
阅读全文
算法与数据结构(1)——栈和队列初步认识
摘要:《栈》栈的实现栈只能在一头进行操作,相对比较容易实现。用一个数组int stack[]和栈顶指针top即可,插入和删除(也称push和pop)栈的实现代码://用一个数组int stack[]和栈顶指针top即可实现//top指向栈顶元素(即栈顶元素的坐标)//这里逻辑上的“顶”实际上为无理数组上的“尾”部;1 stack[++top ] = x ; /¤ push ¤/2 x = s tack [ top ¡¡]; /¤ pop ¤/对物理实现和逻辑实现的理解:和链表删除类似,出栈时并不需要让stack[top]变为0。由于top已
阅读全文
数据结构——堆排序
摘要:堆排序总结堆排序思想:最大堆的堆顶元素是全部数据中的最大值,输出这个值。再将剩余元素整理成新的最大堆,此时堆顶元素有时又是剩余元素的最大值,再输出这个值。继续这个过程,每次输出堆顶元素,并将剩余元素整理成新的最大堆再输出...堆排序要解决的几个问题1:如何将数据排列成堆的形式——初始堆的建立2:输出堆顶元素后,剩余元素如何再整理成新的堆——堆的整理3:输出元素放在什么位置预备知识:1: 堆中的元素存储在一个数组中,根据堆中的各元素之间具有有序性关系,可以使用二叉树的方式来表示一个堆。因为各元素从前至后存放在数组的钱n 个单元中,所以所画的二叉树实际上是一颗完全二叉树2: 所以根据完全二叉树的性
阅读全文
浙公网安备 33010602011771号