- 博客(22)
- 资源 (4)
- 收藏
- 关注
原创 虚拟存储器
今天上午看了《深入理解计算机系统》中关于虚拟存储器的章节,记录如下:首先说为什么要有虚拟存储器我个人觉得虚拟存储器的概念是和进程概念一起出现的。在计算机技术发展的早期,只有单道批处理系统,特点是一次只能运行一个进程,只有运行完毕后才能将下一个进程加载到内存里面,所以进程的数据都是直接放在物理内存上的。到后来发展出了多道程序系统,它要求在计算机中存在着多个进程,处理器需要在多个进程间进行切换。这时候就
2016-08-17 09:16:36 2531
原创 浅剖智能指针----auto_ptr
刚刚在复习的时候遇到了智能指针,就一时兴起去找出了智能指针的源码看了看,现将我对auto_ptr的理解记录如下: Linux下,auto_ptr源码在/usr/include/c++/4.4.7/backword/auto_ptr.hauto_ptr本身是一个模板类,封装了一个原生指针。它最大的特点是在拷贝构造、赋值、传参等过程中对原生指针控制权的转移,即会将自己所管理的指针release掉,并赋
2016-08-12 09:47:46 501
原创 浅谈STL
由于我刚开始学习系统的写博客,个人方面不管是能力还是经验都会有所欠缺,所以肯定会有很多不完善的地方,包括结构安排、要点遗漏、知识错误等等,还请各位批判着看,如有问题,恳请斧正,我将十分感激!STL是一个标准规范,它只是为各种组件定义了一系列统一的访问接口及他们之间搭配使用的一般规则,而没有规定他们的底层实现。因此各开发商都提供自己的STL版本,比较著名的有P.J. Plauger,HP,SGI等。如
2016-08-11 16:13:57 806
原创 所有HTTP返回码
1xx消息:请求已被接受,需要继续处理。HTTP/1.0协议中没有定义任何1xx状态码。 100 Continue 客户端应当继续发送剩余请求。 101 Switching Protocols 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。 102 Processing 处理将被继续执行。2xx成功:请求已成功被服务器接收、理解并接受。
2016-08-11 16:07:55 4987
原创 一个简单的Vector实现
众所周知,STL库以高效而闻名。而且使用它可以很方便的实现我们的主要逻辑,不需要关心各种底层的实现细节。本文模拟实现了一个简单的vector容器。关于vector的介绍请移步:浅谈STL。 代码如下:#ifndef _VECTOR_#define _VECTOR_#include<iostream>#include<assert.h>#include<memory.h>using name
2016-08-11 15:44:14 1838
原创 一个简单的List实现
list和vector是STL库中两个最基本的容器,以下代码模拟实现一个简单的list:#ifndef _MYLIST_#define _MYLIST_#include<iostream>using namespace std;class ListIsEmpty{};class ArgIsIll{};template<typename T>class Node{public: No
2016-08-11 15:43:10 783
原创 一个简单的Heap实现
以下代码实现了一个堆,可以传入仿函数来决定生成最大堆或最小堆。#ifndef _HEAP_#define _HEAP_#include"../Vector/Vector.h"#include<string>using namespace std;template<typename T>class Less{public: bool operator()(const T& t1,co
2016-08-11 15:42:09 776
原创 一个简单的Stack实现
stack的特性不用多说了吧,先进后出。底层可以用vector或list实现。#define _STACK_#include<iostream>#include"../List/MyList.h"using namespace std;class StackIsEmpty{};template<typename T>class MyStack{public: MyStack():my
2016-08-11 15:41:00 1165
原创 一个简单的Deque实现
一个双向队列,底层使用list实现,因为list在push_back,push_front,pop_back,pop_front这些函数中效率较高。#ifndef _DEQUE_#define _DEQUE_#include<iostream>#include"../List/MyList.h"template<typename T>class Deque{public: Deque
2016-08-11 15:39:31 860
原创 一个简单的优先级队列实现
优先级队列底层使用堆来实现。因为堆可以在O(1)的时间内找出优先级最高的元素。 代码如下:#ifndef _PRIORITY_#define _PRIORITY_#include<iostream>#include"../Heap/Heap.h"using namespace std;template<typename T,typename U>class PriorityQu
2016-08-11 15:37:59 1465
原创 一个简单的哈希表实现
哈希算法可以说是效率比较高的一种算法了,基本上时间复杂度为O(1)。但哈希有个坑爹的地方就是冲突的问题。当发生冲突时,有两种解决办法: * 线性探测 * 哈希桶法具体算法不再解释,以下代码使用STL中vector和list实现了一个基于哈希桶的哈希表。 代码如下:#pragma once#include<iostream>#include<vector>#include<list>usi
2016-08-11 15:36:33 910
原创 一个简单的二叉树实现
众所周知,二叉树是一种很重要的数据结构,基于二叉树的哈夫曼树可用于文件压缩,BSTreet、AVLTree可用于排序,RBTree被广泛用在STL中的map,set等容器上和Java中的TreeSet和TreeMap上。 二叉树的节点结构:template<typename T>struct BinaryTreeNode{ T _data; BinaryTreeNode<T>*
2016-08-11 15:24:09 1936
原创 一个简单的二叉搜索树实现
上一篇文章简单实现了一个普通的二叉树,参见这里。 二叉搜索树是二叉树的一种变体,它相比普通二叉树的特性就是里面的数据都是有序的,中序遍历它就可以得到一个升序数组。BSTreet实现代码如下:#pragma onceinclude<iostream>using namespace std;template<typename T> struct BSTreeNode { T _data;
2016-08-11 15:23:20 1123
原创 一个简单的AVL树实现
上一篇文章实现了一个最简单的二叉搜索树,里面理由两个成员函数:插入和中序遍历。我觉得,插入应该算是BSTreet中最核心的一个函数了。 二叉搜索树虽然是一颗排序树,但当数据的插入顺序基本逆序时,BSTreet就退化为一个很近似链表的结构。而链表中查找的时间复杂度为O(n),显然这失去了二叉搜索树O(lgN)的优势。 因此我们可以对BSTree进行改进,使之成为一个平衡的二叉搜索树,即AVL树。
2016-08-11 15:22:29 810
原创 冒泡排序
冒泡排序可以说是最简单的一种排序了,其核心思想是: * 每次比较相邻的两个数,若后面的比前面大,则交换之; * 重复以上步骤,直到所有数都有序为止。代码如下:template<typename T>void BubbleSort(vector<T>& v){ int length=v.size(); int i,j; for(i=0;i<length;++i)
2016-08-11 15:21:35 640
原创 选择排序
我个人认为冒泡排序和选择排序真是一对孪生兄弟,因为我总感觉这两个算法的思想很像,时间复杂度也相同。但其实他们的算法思想是不同的。冒泡排序是从前往后逐个比较相邻的元素,从而使得最大的元素”冒”到数组的最右边。 而选择排序则是将某一个元素与其余所有元素相比较,选出一个最小/最大的元素放在当前位置。 代码如下:template<typename T>void SelectSort(vector<T>
2016-08-11 15:20:47 425
原创 求给定数组的最大子数组
话说前天晚上被网易虐的也是够惨,3道编程题做出来两道,一个运行超时,一个通过率为70%。其实考的是动态规划之类的东西,只可惜我当时没有好好学。虽然牛客网服务器挂了导致考试延长一个小时,但这对我并没有什么实质帮助,不会还是不会呀。 今天开始啃《算法导论》,每天一个算法,坚持! 简单看了下分治这一节,照着书上的思想敲出了”给定数组的最大子数组”的代码,如下:int FindMidMaxSum(con
2016-08-11 15:17:34 543
原创 KMP算法
众所周知,KMP算法的作用是匹配字符串,比如在一个文本编辑器中查找符合某一模式的所有字符等。 就我认为,这个算法还是比较难的,反正我是看了好长时间都没懂,哈哈~ 昨天说了,每天一个算法,坚持下去! 今天看了《算法导论》中关于该算法的部分,对求next数组部分不是特别理解,参考了网上的某些文章,不过他这篇文章的分析确实不错,但代码部分有些缺陷,我已改正过来。简要记录如下:普通的暴力匹配算法是将模
2016-08-11 15:16:16 335
原创 红黑树
当我们在使用二叉搜索树时,如果树的高度较高,对其的操作并不比对链表操作要快。原因是二叉搜索树在插入顺序基本有序时会退化为一个排序链表,所以说是不平衡的。对二叉搜索树的改进有AVL树和红黑树。先来看红黑树,它广泛应用在STL的set和map,Java库和Linux内核等中 。红黑树是一颗平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLANK。通过对任何一条从根节点到
2016-08-11 15:09:17 483
原创 B树
B树是为磁盘或其他直接存取的辅助存取设备而设计的一种多叉平衡搜索树,类似于红黑树,但B树在降低磁盘I/O操作方面要更好一些。许多数据库系统使用B树或B树的变种来存储信息。 我们知道,磁盘I/O是很慢的,因为要涉及到磁头寻道、定址和数据读取时间。寻道是一种机械运动,速度自然慢;定址的平均时间是磁盘旋转周期的一半,目前主流磁盘旋转速度是5400RPM,快一点的也是7200RPM,尽管如此,旋转一圈需要
2016-08-11 15:06:36 361
原创 死锁
当一个系统中多个进程对某些临界资源进行访问时,就有可能发生死锁。所谓死锁,就是多个进程都请求某些资源,而这些资源都由这组进程中的其他进程所保持,这样他们都持有自己的资源而又等待别的进程释放资源的状态。 发生死锁的充分必要条件是:互斥条件:即进程对临界资源的访问时互斥的,不能同时又两个或以上的进程同一访问某一资源。循环等待条件:每个进程都在等待其他进程释放自己所请求的资源。请求和保持条件:每个
2016-08-11 15:02:57 437
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人