摘要: 在一些应用问题中,需要将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 糖拌咸鱼 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 我们期望的数据结构能支持插入操作,并能方便地从中取出具有最小或最大关键码的记录,这样的数据结构即为优先级队列。在优先级队列的各种实现中,堆是最高效的一种数据结构。 最小堆:任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶的结点的关键码是整个元素集合的最小的,所以称它为最小堆。最大堆类似定义。 创建堆:采用从下向上逐步调整形成堆得方法来创建堆。为下面的分支结点调用下调算法siftDown,将以它们为根的子树调整为最小堆。从局部到整体,将最小堆逐步扩大,直到将整个树调整为最小堆。 插入一个元素:最小堆的插入算法调用了另一种堆得调整方法siftUp,实现自下而上的上滑调整。因为每... 阅读全文
posted @ 2011-03-15 13:23 糖拌咸鱼 阅读(1988) 评论(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 糖拌咸鱼 阅读(529) 评论(0) 推荐(0) 编辑
摘要: 【函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int (*f)(int x);double (*ptr)(double x);在定义函数指针时请注意:函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针 阅读全文
posted @ 2011-03-10 15:49 糖拌咸鱼 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。代码如下:#include<iostream>using namespace std;struct Node{ int value; Node * link; Node() { value=0; link=NULL; }};//返回反向链表的头结点Node* Reserve(Node * head){ Node * pre,*next; pre=head; head=head->link; pre->link=NULL; while(head!=NULL) { next=head->link; he 阅读全文
posted @ 2011-03-09 16:21 糖拌咸鱼 阅读(431) 评论(1) 推荐(0) 编辑
摘要: 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。思路:将字符串看做AB两部分,将A反转,再将B反转,最后将反转后的A+反转后的B一起反转就OK了。#include<iostream>#include<assert.h>using namespace std;const int MAX=100;//反转从start到end的字符串svoid Reversal(int start,int end,c 阅读全文
posted @ 2011-03-09 15:50 糖拌咸鱼 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现依次的数字,因为那些出现两次的数字全部在异或中抵消掉了。有了上面简单问题 阅读全文
posted @ 2011-03-09 13:54 糖拌咸鱼 阅读(1380) 评论(5) 推荐(0) 编辑
摘要: 题目1:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。思路:模拟二进制加法,先加不进位得A,然后算进位得B,然后(B<<1)+A即得到两个数之和。A可以由两个数的^得到,B可以有A&B得到。int plus(int num1,int num2){ if(num2==0) return num1; return plus(num1^num2,(num1&num2)<<1);}题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)思 阅读全文
posted @ 2011-03-08 10:47 糖拌咸鱼 阅读(1656) 评论(1) 推荐(0) 编辑
摘要: 最近一直在准备面试,因为要实习了,然后我就纠结了,不知道自己到底处在一个什么样的水平,到底应该选择怎样的实习单位。但是,不管怎么样,还是多看看题吧,感觉面试题还是挺好玩的。最近又在看《编程之美》,感觉有些收获,其实编程真的可以很美,呵呵。题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。 看过《编程之美》的人,应该都知道书上的解题思路,它总是先从最容易想到的解决方法入手,然后再一直追问,有没有更好的解决方法。我觉得这个解决问题的思路非常好,任何问题都要一 阅读全文
posted @ 2011-03-07 23:17 糖拌咸鱼 阅读(3943) 评论(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 糖拌咸鱼 阅读(25798) 评论(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 糖拌咸鱼 阅读(302) 评论(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 糖拌咸鱼 阅读(723) 评论(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 糖拌咸鱼 阅读(297) 评论(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 糖拌咸鱼 阅读(250) 评论(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 糖拌咸鱼 阅读(2001) 评论(0) 推荐(0) 编辑
摘要: 顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。标准库里定义了三种类型:vector(支持快速随机访问)、list(支持快速插入、删除)、deque(双端队列)容器只定义了少量操作,大多数额外的操作由算法库提供。容器内元素的类型约束;1、元素类型必须支持赋值运算;2、元素类型的对象必须可以复制。这是容器元素类型的最低要求,如果想支持一些其他特殊要求,则必须具备相关的性质。可以定义容器的容器vector< vector<int> > lines;//必须使用"> >"中间的空格,否则会出现变异错 阅读全文
posted @ 2011-02-20 10:24 糖拌咸鱼 阅读(667) 评论(0) 推荐(0) 编辑
摘要: #include <stdio.h>#include <signal.h>#include <arpa/inet.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/ip_icmp.h>#include <netdb.h>#include <setjmp.h> 阅读全文
posted @ 2010-12-05 21:16 糖拌咸鱼 阅读(6277) 评论(1) 推荐(0) 编辑
摘要: Server:#include <stdio.h>#include <string.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#define MAXSIZE 1024#define SERV_PORT 2000void dg_echo(int sockfd, struct sockaddr * pcliaddr, socklen_t clilen){ int n; socklen_t len; while(1) { char mesg[M 阅读全文
posted @ 2010-12-05 21:12 糖拌咸鱼 阅读(491) 评论(0) 推荐(0) 编辑
摘要: 最近在学习unix网络编程,现在正在学习tcp的通信。其实,只要建立起了tcp通信,操作远端的计算机就不是什么问题了。正向telnet一样,也是基于tcp/IP协议的。所以这个实验,也算是对telnet功能的一种简单的模拟。 但是,值得注意的问题是关机涉及到系统权限,所以要给运行在Server端的程序以足够的权限,这样才可以在接收到Client端的关机请求时,执行关机。将会模拟如下执行过程:1. 执行 mytelnet 跟上参数telnet服务器 IP地址 127.0.0.12. 输入login 向服务器请求登录,随之服务器会要求输入密码3. 输入一个错误的登录密码 1234. 服务器验证不. 阅读全文
posted @ 2010-12-05 21:07 糖拌咸鱼 阅读(1172) 评论(0) 推荐(0) 编辑
摘要: TCP连接的建立以及利用tcpdump分析连接建立的过程一、实验目的实验1_1:使用Freebsd/Linux操作系统下的C编译器和网络程序的调试方法,掌握TCP连接建立和终止以及调整缓冲区大小的方法。实验1_2:使用ethereal/TCPDump等抓包工具,截取TCP建立过程中产生的数据包,分析连接建立过程。二、实验环境操作系统:Ubuntu 10.04 系统编辑器:vim网络环境:PC1:Ipv4地址10.3.1.210 PC2:Ipv4地址10.3.1.211 两台电脑在同一个网段,可以互相通信,能ping通。代码语言:c语言代码编译器:gcc编译器三、实验内容1.设计思路该实验分为两 阅读全文
posted @ 2010-12-05 20:49 糖拌咸鱼 阅读(1992) 评论(0) 推荐(0) 编辑
摘要: 最近刚接触Silverlight,感觉学习Silverlight还是要先从控件学起。Silverlight Toolkit 是一个非常不错的控件集,里面具有很多很实用的东西,所以先学习些这些东西还是很有好处的。自己原来通过写鼠标的各种事件,实现鼠标拖动组件的功能,今天学了学Sliverlight Toolkit 工具,发现有DragDropTarge很好用的东西。废话不多说,直接上代码。 首先放上两个ListBox,利用ListBoxDragDropTarget实现拖拽效果。 这里需要注意的是,如果想要实现一个ListBox内部的重排序功能,就必须要定义一下ListBox.ItemPanel, 阅读全文
posted @ 2010-09-11 21:07 糖拌咸鱼 阅读(1264) 评论(0) 推荐(0) 编辑
摘要: 核心代码:using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System. 阅读全文
posted @ 2010-09-06 20:56 糖拌咸鱼 阅读(1445) 评论(2) 推荐(0) 编辑