- 博客(63)
- 资源 (7)
- 收藏
- 关注
转载 数据结构基础(18) --哈希表的设计与实现
哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“映像”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。 构造哈希函数的方法1. 直接定址法(数组) 哈希函数为关键字的线性函数H(key) = key 或者 H(key) = a*ke
2016-01-28 15:38:18 1059
转载 数据结构基础(17) --二叉查找树的设计与实现
二叉排序树的特征二叉排序树或者是一棵空树,或者是具有如下特性的二叉树: 1.每一元素都有一个键值, 而且不允许重复; 2.若它的左子树不空,则左子树上所有结点的值均小于根结点的值; 3.若它的右子树不空,则右子树上所有结点的值均大于根结点的值; 4.它的左、右子树也都分别是二叉排序树。二叉排序树
2016-01-28 15:36:45 888
转载 数据结构基础(16) --树与二叉树
树的基本术语1.结点:{数据元素+若干指向子树的分支}2.结点的度:分支的个数(子树的个数)3.树的度:树中所有结点的度的最大值4.叶子结点:度为零的结点5.分支结点:度大于零的结点(包含根和中间结点)6.(从根到结点的)路径:由从根到该结点所经分支和结点构成;7.结点的层次:假设根结点的层次为1,则根的孩子为第2层,如果某节点在第L层,则其
2016-01-28 15:33:58 541
转载 数据结构基础(15) --基数排序
基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。实现多关键字排序通常有两种作法: 最低位优先法(LSD) 先对K[0]{基数的最低位}进行排序,并按 K(0) 的不同值将记录序列分成若干子序列之后,分别对 K[1] 进行排序,..., K[d-1]依次类推,直至最后对最次位关键字排序完成为止。 最高位优先法(MSD)
2016-01-28 15:32:47 602
转载 数据结构基础(14) --链式队列的设计与实现
链式队列是基于单链表的一种存储表示, 其形状如下图所示: (队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点) 用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况; 链式队列结点构造:[这次我们将节点构造成了类LinkQueue的
2016-01-28 15:31:08 451
转载 数据结构基础(13) --链式栈的设计与实现
采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的); 与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素”搬家”, 而链栈则省略了这一”耗时耗力”的工作, 但却需要付出附加一个指针的代
2016-01-28 15:29:55 428
转载 数据结构基础(12) --双向循环链表的设计与实现
双向链表的操作特点: (1) “查询” 和单链表相同; (2)“插入” 和“删除”时需要同时修改两个方向上的指针。 但是对于双向循环链表则在表尾插入非常的迅速, 只需O(1)的时间,因为有指向前面的指针, 因此双向循环链表会很容易的找到位于表尾的元素,因此双向循环链表比较适用于频繁在表尾插入的情况.空链表:
2016-01-28 15:28:35 503
转载 数据结构基础(11) --循环链表的设计与实现
循环链表:最后一个结点的指针域的指针又指回第一个结点的链表; 循环单链表与单链表的区别在于:表中最有一个节点的指针不再是NULL, 而改为指向头结点(因此要对我们原来的MyList稍作修改), 从而整个链表形成一个环. 因此, 循环单链表的判空条件不再是头结点的指针是否为空, 而是他是否等于头结点; 其实如果只是单纯的实现循环链表对单链表的性能提升
2016-01-28 15:27:10 503
转载 数据结构基础(10) --单链表迭代器的设计与实现
为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素:首先:Node节点需要做如下修改(注意后缀有+的代码)[cpp] view plain copy //链表节点 template typename Type> class
2016-01-28 15:24:07 550
转载 数据结构基础(9) --单链表的设计与实现(2)之高级操作
链表的链接: 将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下:[cpp] view plain copy //链表的链接 template typename Type> void MyList::concatenate(const MyList &list) { if (i
2016-01-28 15:22:11 357
转载 数据结构基础(8) --单链表的设计与实现(1)之基本操作
链表简介数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N);
2016-01-28 15:18:53 666
转载 数据结构基础(7) --循环队列的设计与实现
队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为”先进先出(FIFO)”,故又称为先进先出的线性表,简单队列如图所示: 循环队列 顺序队列有一个先天不足, 那就是空间利用率不高, 会产生”假溢出”现象,即:其实队列中还有空闲的空间以存储元素, 但我们在判断队列是否还有空间时, 队列告
2016-01-28 15:17:19 492
转载 数据结构基础(6) --顺序栈的设计与实现
栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, f
2016-01-28 15:15:43 428
转载 数据结构基础(5) --归并排序
归并排序的基本思想: 将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, ...., 如此重复, 直到合并成为一个长度为n的有序表为止, 这种排序方法称为2-路归并排序.如图为一个2-路归并排序的一个示例:
2016-01-28 15:14:22 412
转载 数据结构基础(4) --快速排序
快速排序是最流行的,也是速度最快的排序算法(C++ STL 的sort函数就是实现的快速排序); 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数
2016-01-28 15:11:38 326
转载 数据结构基础(3) --Permutation & 插入排序
Permutation(排列组合)排列问题:设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每一个排列前加上前缀ri得到的排列.R的全排列可归纳定义如下:当n=1时,Permutati
2016-01-28 15:10:30 638
转载 数据结构基础(2) --顺序查找 & 二分查找
顺序查找适用范围:没有进行排序的数据序列缺点:速度非常慢, 效率为O(N)[cpp] view plain copy //实现 template typename Type> Type *sequenceSearch(Type *begin, Type *end, const Type &searc
2016-01-28 15:09:09 314
转载 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
Swap的简单实现[cpp] view plain copy //C语言方式(by-pointer): template typename Type> bool swapByPointer(Type *pointer1, Type *pointer2) { //确保两个指针不会指向同一个对象 if (po
2016-01-28 15:07:29 384
转载 八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,
2016-01-28 15:02:19 370
原创 什么是排序算法的稳定性
排序算法的稳定性,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其
2016-01-28 14:36:16 5675
转载 Top k 算法
Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
2016-01-25 16:15:23 267
原创 C++常用库函数atoi,itoa,strcpy,strcmp的实现
1. 整数转换成字符串 itoa 函数的实现#include "stdafx.h"#include using namespace std;void itoaTest(int num,char str[] ){ int sign = num,i = 0,j = 0; char temp[11]; if(sign<0)// 判断是否 是一个负数
2016-01-25 15:59:04 510
原创 几个 shell 的题目
1、 创建file0, file1, … , file9十个文件。 2、 对/etc/passwd文件按照“:”分隔的第一个字段排序,并输出第三行到第五行。 3、 比较两个文件是否相同(忽略空行)。 4、 从光盘制作iso文件,做完后把光盘弹出。 5、 产生一个1G大小的文件。 6、 显示系统的网卡信息。 7、 统计当前系统TCP连接的总数。 8、 将/home目录下所
2016-01-25 15:41:22 593
转载 学习STL map, STL set之数据结构基础
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封
2016-01-25 10:48:59 418
原创 STL容器的实现原理
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持下标访问,而list是以链表形式实现的,不支持下标访问。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,
2016-01-25 10:45:26 549
原创 C++笔试题总结(二)
16. 关联、聚合(Aggregation)以及组合(Composition)的区别?涉及到UML(建模语言)中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,如下图所示,用空的菱形表示聚合关系:从实现的角度讲,聚合可以表示为:class A {...} class B { A
2016-01-09 18:24:37 450
原创 C++笔试题总结(一)
1.求下面函数的返回值(微软)int func(x){int countx = 0;while(x){countx ++;x = x&(x-1);}return countx;}假定x = 9999。 答案:8思路:将x转化为2进制,看含有的1的个数。2. 什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“
2016-01-09 18:14:32 538
转载 Socket编程实践(13) --UNIX域协议
UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程, 而且UNIX域协议机制本质上就是可靠的通讯, 而网络协议是为不可靠的通讯设计的). UNIX域套接字可以在同一台主机上各进程之
2016-01-04 12:38:25 377
转载 Socket编程实践(12) --UDP编程基础
UDP特点 无连接,面向数据报(基于消息,不会粘包)的数据传输服务; 不可靠(可能会丢包, 乱序, 重复), 但因此一般情况下UDP更加高效;UDP客户/服务器模型 UDP-API使用[cpp] view plaincopy#include #inclu
2016-01-04 12:37:28 369
转载 Socket编程实践(11) --epoll原理与封装
常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 select/polL模型和epoll模型。 1 、PPC/TPC 模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我(详见本系列博客)
2016-01-04 12:36:15 521
转载 Socket编程实践(10) --select的限制与poll的使用
select的限制用select实现的并发服务器,能达到的并发数一般受两方面限制:1)一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n(number)来调整或者使用setrlimit函数设置,但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看[cpp]
2016-01-04 12:35:01 440
转载 Socket编程实践(9) --套接字IO超时设置方法
引:超时设置3种方案1. alarm超时设置方法[cpp] view plaincopy//代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(SIGALRM, sigHandlerForSigAlr
2016-01-04 12:33:41 926
转载 Socket编程实践(8) --Select-I/O复用
五种I/O模型介绍(1)阻塞I/O[默认] 当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了数据,Linux内核recv端缓冲区数据到达,内核会把数据copy给用户空间。然后上层应用App解除阻塞,执行下一步操作。 (2)非阻塞I/
2016-01-04 12:32:26 510
转载 Socket编程实践(7) --Socket-Class封装(改进版v2)
本篇博客定义一套用于TCP通信比较实用/好用Socket类库(运用C++封装的思想,将socket API尽量封装的好用与实用), 从开发出Socket库的第一个版本以来, 作者不知道做了多少改进, 每次有新的/好的想法尽量实现到该库当中来; 而且我还使用该库开发出作者第一个真正意义上的基于Linux的Server程序[MyHttpd, 在后续的博客当中, 我一定会将MyHttpd的实现原理与实现
2016-01-04 12:31:13 534
转载 Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程[cpp] view plaincopysignal(SIGCHLD,onSignalCatch);
2016-01-04 12:28:43 770
转载 Socket编程实践(5) --TCP粘包问题与解决
TCP粘包问题由于TCP协议是基于字节流且无边界的传输协议, 因此很有可能产生粘包问题, 问题描述如下 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, 有以下方式接收: 先接收M1, 再接收M2(正确方式) 先接收M2, 再接收M1(错误) 一次性收到20k数据(错误)
2016-01-04 12:27:35 505
转载 Socket编程实践(4) --多进程并发server
1.Socket地址复用[cpp] view plaincopyint getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int lev
2016-01-04 12:26:15 409
转载 Socket编程实践(3) --Socket API
socket函数[cpp] view plaincopy#include #include int socket(int domain, int type, int protocol); 创建一个套接字用于通信参数: domain:指定通信协议族(protocol family),常用
2016-01-04 12:21:53 417
转载 Socket编程实践(2) --Socket编程导引
什么是Socket? Socket可以看成是用户进程与内核网络协议栈的接口(编程接口, 如下图所示), 其不仅可以用于本机进程间通信,可以用于网络上不同主机的进程间通信, 甚至还可以用于异构系统之间的通信。 IPv4套接口地址结构 IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中
2016-01-04 12:20:35 312
转载 Socket编程实践(1) --TCP/IP简述
ISO的OSI OSI(open system interconnection)开放系统互联模型是由ISO国际标准化组织定义的网络分层模型,共七层, 从下往上为:OSI七层参考模型物理层(Physical Layer)物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为
2016-01-04 12:18:29 522
基于STM32的usb鼠标
2015-12-12
基于NRF24L01无线模块的RFID刷卡系统
2015-12-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人