随笔分类 -  C++ & Algorithm & Data Structure

1
摘要:主要分为 3 个部分,memoryPool 是管理内存池类,block 表示内存块,chunk 表示每个存储小块。它们之间的关系为,memoryPool 中有一个指针指向某一起始 block,block 之前通过 next 指针构成链表结构的连接,每个 block 包含指定数量的 chunk。每次分配内存的时候,分配 chunk 中的数据地址。主要数据结构设计:Block:struct block { block * next;//指向下一个block指针 unsigned int numofChunks; unsigned int numofFreeChunks;//剩余... 阅读全文
posted @ 2013-03-17 17:27 糖拌咸鱼 阅读(2212) 评论(0) 推荐(0)
摘要:Question1用动态规划方法手工求解下面的问题:某工厂调查了解市场情况,估计在今后四个月内,市场对其产品的需求量如下表所示。时期(月)需要量(产品单位)12342324已知:对每个月来讲,生产一批产品的固定成本费为 3 (千元),若不生产,则为零。每生产单位产品的成本费为 1 (千元)。同时,在任何一个月内,生产能力所允许的最大生产批量为不超过6个单位。又知每单位产品的库存费用为每月 0.5 (千元),同时要求在第一个月开始之初, 及在第四个月末,均无产品库存。 问:在满足上述条件下,该厂应如何安排各个时期的生产与库存,使所花的总成本费用最低?要求:写出各种变量、状态转移方程、递推关系式、 阅读全文
posted @ 2012-11-27 11:03 糖拌咸鱼 阅读(3792) 评论(5) 推荐(1)
摘要:URL队列被爬行进程赋予一个URL(或者来自于其他爬行进程的主机分离器)。它维护了一个包含大量URL的队列,并且每当有爬虫线程寻找URL的时候,它都会按照某种顺序重新排序。以何种顺序返回队列中的URL,需要有两个方面的考虑。 第一个要考虑的是具有很高更新频率的高质量页面,即页面的优先级。一个页面的优先级权值应该是由它的改变频率和它本身网页质量(使用一些恰当的质量评估方法)共同决定的。这是很必要的,因为在每次抓取的时候,很多更新频率很高的页面都是质量很差的垃圾页面。 第二个要考虑的就是礼貌策略:我们必须避免在很短的时间间隔内重复抓取同一个主机。因此,如果URL队列被设计成简单的优先级队列的话,. 阅读全文
posted @ 2012-04-15 16:40 糖拌咸鱼 阅读(7357) 评论(0) 推荐(0)
摘要:题外话: 很久没写博客了,因为前一段时间过年在家放假,又因为自己保研了,所以一直比较闲。整个假期,基本都在准备毕业设计的相关内容。我毕业设计的方向是关于搜索引擎的,因此,期间阅读了大量相关论文。阅读了很多论文和技术书籍之后,我有几点感触。首先,发现国内很多论文或是书籍只是大量引述其他人的研究结果,自己的独特的见解非常少,一篇文章,70%的内容都是在以介绍为主,感觉发这样的论文是没有什么意义的。相反,国外尤其是像MIT,斯坦福,google之类的领域专家发表很多极其优秀的论文,阅读后给人一种震撼。我之前在网上搜索技术文章或是论文的时候经常绕过英文的,现在发现国外的确有非常多优秀的外文文章,所以无 阅读全文
posted @ 2012-02-23 15:09 糖拌咸鱼 阅读(8804) 评论(1) 推荐(2)
摘要:在《一致性hash算法(consistent hashing)》一文中已经介绍了一致性hash的基本原理,本文将会对其具体实现细节进行描述,并用c++语言对一致性hash进行了简单的实现。 一致性hash算法实现有两个关键问题需要解决,一个是用于结点存储和查找的数据结构的选择,另一个是结点hash算法的选择。 首先来谈一下一致性hash算法中用于存储结点的数据结构。通过了解一致性hash的原理,我们知道结点可以想象为是存储在一个环形的数据结构上(如下图),结点A、B、C、D按hash值在环形分布上是有序的,也就是说结点可以按hash值存储在一个有序的队列里。如下图所示,当一个hash值为-2. 阅读全文
posted @ 2011-11-27 16:52 糖拌咸鱼 阅读(12379) 评论(12) 推荐(4)
摘要:函数重载:在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,即函数重载。重载的实现:几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素:参数与返回值。如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。隐藏规则:本来仅仅区 阅读全文
posted @ 2011-06-12 14:00 糖拌咸鱼 阅读(566) 评论(0) 推荐(0)
摘要:#include<iostream>using namespace std;//非递归求解所有的子集void fun(int a[] , int n){ int i = 0 , j ; while(i < (1<<n)) //2的n次方 { for(j = 0 ; j < n ; j ++) { if(i&(1<<j)) { cout<<a[j]<<"\t"; } } cout<<endl; i++; }}//递归求解所有的子集void print(int a[],bool flag 阅读全文
posted @ 2011-05-09 09:18 糖拌咸鱼 阅读(577) 评论(0) 推荐(0)
摘要:#include<iostream>#include<assert.h>using namespace std;struct node{ int val; node * next; node(int v) { val=v; next=NULL; }};node * merge(node* list1 , node * list2){ assert(list1!=NULL&&list2!=NULL); node * res; if(list1->val<=list2->val) { res=list1; list1=list1->n 阅读全文
posted @ 2011-05-07 16:59 糖拌咸鱼 阅读(372) 评论(0) 推荐(0)
摘要:#include<iostream>#include<assert.h>#include<stack>#include<queue>using namespace std;struct Node{ int v; Node *leftChild,*rightChild; Node():leftChild(NULL),rightChild(NULL){} Node(int vv):leftChild(NULL),rightChild(NULL) { v=vv; }};void print(int v){ cout<<v<<&q 阅读全文
posted @ 2011-04-10 09:11 糖拌咸鱼 阅读(465) 评论(0) 推荐(0)
摘要:在一些应用问题中,需要将n个不同的元素划分成一组不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定规律将归于同一组元素的集合合并。在此过程中要反复用到查询某个元素归属于哪个集合的运算。适合于描述这类问题的抽象数据类型称为并查集。 并查集支持3中操作:(1)Union(root1,root2) 把子集合root2并入集合root1中,要求root1与root2互不相交,否则不执行合并。(2)Find(x)搜索单元素x所在的集合,并返回该集合的名字。(3)UFSets(sz) 构造一个并查集,并将所有元素的元素初始化为只有一个单元素的子集合。#include<iostream> 阅读全文
posted @ 2011-03-16 10:40 糖拌咸鱼 阅读(294) 评论(0) 推荐(0)
摘要:我们期望的数据结构能支持插入操作,并能方便地从中取出具有最小或最大关键码的记录,这样的数据结构即为优先级队列。在优先级队列的各种实现中,堆是最高效的一种数据结构。 最小堆:任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶的结点的关键码是整个元素集合的最小的,所以称它为最小堆。最大堆类似定义。 创建堆:采用从下向上逐步调整形成堆得方法来创建堆。为下面的分支结点调用下调算法siftDown,将以它们为根的子树调整为最小堆。从局部到整体,将最小堆逐步扩大,直到将整个树调整为最小堆。 插入一个元素:最小堆的插入算法调用了另一种堆得调整方法siftUp,实现自下而上的上滑调整。因为每... 阅读全文
posted @ 2011-03-15 13:23 糖拌咸鱼 阅读(2012) 评论(2) 推荐(0)
摘要:定义: 结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。假设有n个权值,试构造一棵有n个叶子结点的二叉树,每个叶子结点带权为wi,则其中带权路径长度最小的二叉树称做最优二叉树或赫夫曼树。构造赫夫曼树的方法: (1)根据给定的n个权值{w1,w2,w3......}构成n棵二叉树的集合F={T1,T2,T3,T4......},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。(2)在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。( 阅读全文
posted @ 2011-03-14 23:08 糖拌咸鱼 阅读(550) 评论(0) 推荐(0)
摘要:【函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int (*f)(int x);double (*ptr)(double x);在定义函数指针时请注意:函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针 阅读全文
posted @ 2011-03-10 15:49 糖拌咸鱼 阅读(396) 评论(0) 推荐(0)
摘要:C++中^运算表示的是二进制的异或运算2^4=6010^100=110使用该运算可以实现无中间变量两数字的兑换下面的例子实现a和b的置换a=2;b=4;a=a^b;b=a^b;a=a^b;异或^是一个非常重要的运算符,大量问题可以利用异或的特点找到解决方案,尤其是在各大公司的面试题中。异或绝对是一个关键的运算符。例如:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/http://www.cnblogs.com/coser/archive/2011/03/08/1976949.html 阅读全文
posted @ 2011-02-28 20:46 糖拌咸鱼 阅读(25851) 评论(0) 推荐(0)
摘要:系统是如何找到头文件的: 当我们自定义一个头文件的时候,系统是如何找到这个头文件的呢?其实 ,我们可以发现我们在预处理#include"head.h" 用的是双引号,而不是尖括号是因为,当用双引号的时候,系统会首先在文件所在的目录下寻找该头文件。如果找不到,预处理器会在c++标准库头文件中去继续寻找而当我们使用尖括号的时候,系统只会在c++标准库头文件中去寻找!获取系统时间:#include<iostream>#include "ctime"using namespace std;int main(void){ tm *local; time 阅读全文
posted @ 2011-02-27 20:22 糖拌咸鱼 阅读(313) 评论(0) 推荐(0)
摘要:大多数c++类采用以下三种方法之一管理指针成员:1、指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。2、类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。3、类采取值型行为。指针所指向的对象是唯一的,由每个类对象独立管理。方法一:简单使用#include<iostream>using namespace std;class HasPtr{public: HasPtr(int * p,int n) { ptr=p; num=n; } void setPtr(int * p) { ptr=p; } void setNum(in 阅读全文
posted @ 2011-02-26 11:51 糖拌咸鱼 阅读(738) 评论(0) 推荐(1)
摘要:explicit作用:在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。#include<iostream>using namespace std;class Test{public: explicit Test(int a)//构造函数加explicit修饰,不允许发生隐式类型装换 { number=a; }private: int number;};int main(){ Test test(10);//这样总是对的 Test test2=10;//当构造函数加入explicit修饰时,程序将 阅读全文
posted @ 2011-02-25 16:27 糖拌咸鱼 阅读(312) 评论(0) 推荐(0)
摘要:#include<iostream> using namespace std; int main() { const int max=100; const int min=-100; //C++语言强制要求指向const对象的指针也必须具有const特性 //指向const对象的指针 //虽然指向的是const的值,但是指针本身并不是const的,所以指针仍然可以改变其值(地址值),指针所指向的对象则不可以改变 const int * ptr=&max; ptr=&min;// it is ok //*ptr=10; it is wrong,指向的是const值,所 阅读全文
posted @ 2011-02-23 09:35 糖拌咸鱼 阅读(261) 评论(1) 推荐(0)
摘要:关联容器 关联容器支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键。pair类型:在头文件utility中定义。pair的创建和使用:#include<utility>pair<string,int> author("Peter 阅读全文
posted @ 2011-02-21 13:41 糖拌咸鱼 阅读(2020) 评论(0) 推荐(0)
摘要:顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。标准库里定义了三种类型:vector(支持快速随机访问)、list(支持快速插入、删除)、deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供。容器内元素的类型约束;1、元素类型必须支持赋值运算;2、元素类型的对象必须可以复制。这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质。可以定义容器的容器vector< vector<int> > lines;//必须使用"> >"中间的空格,否则会出现变异错 阅读全文
posted @ 2011-02-20 10:24 糖拌咸鱼 阅读(683) 评论(0) 推荐(0)

1