摘要:
树结构的基本思想是分割。普通二叉搜索树是按对象来进行划分,效果往往和数据结构内对象有关;而线段树是根据关键码的可能范围来分的,这种技术叫做关键空间分解!线段树的处理对象是线段(一般意义上的区间可以抽象成线段),它把线段组织成利于检索和统计的形式,本质上是线段的二叉搜索树!当然,线段树特殊点在与其中的线段可以分解和合并,另外,线段树操作的是整个区间,它的渐进时间效率不依赖于数据结构中的对象。线段树是一颗二叉搜索树,最终将一个区间[1, n]划分为一些[i, i+1]的单元区间,每个单元区间对应线段树中的一个叶子节点;每个节点用用变量count来记录覆盖该节点的线段条数。那么线段树的处理对象是什么 阅读全文
摘要:
桶排序(Bucket Sort)有时也称为盒子排序(Bin Sort),来源于邮局使用的盒子信件分发方法。桶排序的有效性需假定输入数据是由一个完全随机过程产生,即要求桶排序的输入数据呈均匀分布,例如,输入数据随机均匀分布在区间[0, 1)。桶排序思想如下:1)把区间[0, 1)分解为n个大小相等的桶;2)将n个输入数据按照其取值不同分配到n个桶里面;3)对每个桶里面的数据进行排序;4)然后将桶里面的数据按顺序收集。桶排序的伪代码程序如下:输入数组:[1..n],对任意i,我们有0≤A[i]<1辅助数组:B[0..n-1]个链表,初始状态均为空BUCKET-SORT(A, n):For i 阅读全文
摘要:
问题:对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。测试数据:输入:cmc snmn 2 (分别表示字符串A、B和定值k)输出:10解答:设字符串A和B的字串A[1...i]和B[1...j]的扩展距离是val(i, j); 阅读全文
摘要:
问题:给定一个单向链表,设计一个时间优化并且空间优化的算法,找出该链表的倒数第m个元素。实现您的算法,注意处理相关的出错情况。m定义为当m=0时,返回链表最后一个元素。解答:这是一个难题,因为单向链表只能正向遍历,这个问题需要根据元素与链表尾的相对位置来找出该元素,但是当发现链表尾时,没有简单的办法回溯到倒数第m个元素。我们需要的是倒数第m个元素,所以,如果我们从某个元素开始,遍历了m个元素之后刚好到达链表末尾,那这个元素就是要找的元素。一种方法是简单的以这种方式检查每个元素,直到找到要找的元素为止。但这样同样的元素会被遍历多次,针对链表中大部分元素我们都会遍历m个元素,如果链表的长度是n的话 阅读全文
摘要:
问题:发现并修复下面C/C++函数中的缺陷,该函数是想从一个单向链表中删除头元素。void removeHead(Node *head){ delete head; head = head->next;}解答:缺陷发现策略:对于拿到的任何函数,考虑下面4个常见的问题:1)检查数据是否正确地进入了该函数;2)检查函数的每一行是否能正确工作;3)检查该函数的输出数据是否正确;4)检查常见的错误情况,如以指针为参数的函数在传入空指针时会失败。函数释放了head之后,有对head进行引用,错误;我们试着将这两行颠倒位置,就会导致head之后的元素被删除,而不是head。因此正确的方法是利用一个临 阅读全文
摘要:
记住头元素:单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。在C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:bool insertInFront(IntElement *head, int data){ IntElement *newItem = new IntElement; if(!newItem) return false; newItem->data = data; newItem->next = head->next; hea 阅读全文
摘要:
问题:一个链表要么以NULL结尾(非循环的),要么以循环结尾(循环的),请编写一个函数,接受链表的头指针作为参数,确定该链表是循环的还是非循环的。如果链表是循环的,函数返回true,如果是非循环的,函数返回false。注意,不能以任何方式修改链表。解答:这两种链表的区别在与它们的末尾。在非循环链表中,末尾节点是以NULL结束的,因此只要遍历链表,直到找到一个以NULL结尾的节点就行;但在非循环链表中,仅仅遍历链表,就会陷入死循环中。所以我们先研究一下末尾节点。对于循环链表中末尾节点指向的节点,还有另一个指针(头指针)指向它。这意味着有两个指针指向了同一个节点,这个节点是唯一一个有两个元素指向的 阅读全文
摘要:
WinSock数据结构:在VC的头文件winsock.h和winsock2.h中定义了许多常数、变量类型和数据结构:1、动态链接库关联的数据结构WSAData:(winsock2.h中的定义,winsock.h中的定义类似)#define WSADESCRIPTION_LEN 256#define WSASYS_STATUS_LEN 128typedef struct WSAData { WORD wVersion; //winsock版本 WORD wHighVersion; //系统可以支持的最高版本 char szDescription[WSADESCRIPTION_LEN+1]; // 阅读全文
摘要:
Color Me LessTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 18730Accepted: 8886DescriptionA color reduction is a mapping from a set of discrete colors to a smaller one. The solution to this problem requires that you perform just such a mapping in a standard twenty-four bit RGB color space. 阅读全文
摘要:
Common SubsequenceTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 17815Accepted: 6847DescriptionA subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > 阅读全文