- 博客(63)
- 收藏
- 关注
转载 硬盘的读写原理
转载自:http://blog.csdn.net/hguisu/article/details/7408047 硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-1
2016-04-29 09:56:10 866
原创 B树
常见的动态查找树有:二叉查找树(BST)、平衡二叉查找树(AVL)、红黑树(RB-Tree)、B-tree/B+-tree。 由于前面三种树都属于二叉树,因此树的高度为(log2N)。树查找的时间复杂度与树的高度有关,因此要提高查找效率必须要降低树的高度,所以我们可以想到多叉树。 B树、B+树都是基于多叉树实现的。磁盘读取 (参考http://blog.csdn.net/v_july_
2016-04-26 18:48:47 8732 1
原创 哈希表
哈希表 哈希表是根据关键码(key)直接进行访问的数据结构。通过将key通过特定映射函数映射到某一位置直接存储、访问。 哈希表查找的时间复杂度最好时可以为O(1)。在最坏情况下,哈希表会退化为单链表,此时时间复杂度为O(n)。若关键字为k,则其值存放在f(k)的存储位置上,称这个对应关系f为散列函数对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为碰
2016-04-25 15:50:35 737
原创 堆和堆排序
堆 二叉堆是一种基于数组的数据结构。它可以被视为一棵完全二叉树。 二叉堆可以分为大根堆和小根堆,大根堆是指父节点的key总是大于或等于任何一个子节点的key,因此堆的根节点为最大值。而小根堆则相反,因此小根堆的根节点为所有元素中的最小值。 二叉堆必须满足两个特性: 1)父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值 2)每个结点的左子树和右子树都是一个二叉堆(
2016-04-25 14:40:27 841
转载 C++内存管理
转载自:http://blog.csdn.net/zhanghefu/article/details/5003407C++内存管理 [导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内
2016-04-22 15:47:00 551
原创 C++的多态
C++多态 多态,对同一个接口有多种实现方式,即“一个接口,多种实现”, C++有两种实现多态的方法: 1)编译时多态:通过函数重载实现 2)运行时多态:通过虚函数实现编译时多态: C++同一范围中声明几个功能类似的同名函数,然后在调用时根据传入的参数选择合适的函数。 重载的函数必须满足## 函数名相同、函数的形式参数(指参数的个数、类型或者顺序)不同 如果两个函数
2016-04-22 14:11:28 389
原创 C、C++中的关键字总结
一、C语言的关键字 共有32个1 数据类型关键字(12个): char double enum float int long short signed struct union unsigned void 2控制语句关键字(12个): 循环语句 :for do while break continue 条件语句 :if else goto 开关语句 :sw
2016-04-21 20:42:59 1234
原创 TCP相关面试题总结
TCP建立连接过程 wireshark抓包为:(wireshark会将seq序号和ACK自动显示为相对值) 1)主机A发送标志syn=1,随机产生seq =1234567的数据包到服务器,主机B由syn=1知道,A要求建立连接; 2)主机B收到请求后要确认连接信息,向A发送ack =(主机A的seq+1),标志syn=1,ack=1,随机产生seq=
2016-04-19 19:03:08 15906
原创 常见锁的区别及适用场景
互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒自旋锁:spinlock,在任何时刻同样只能有一个线程访问对象。但是当获取锁操作失败时,不会进入睡眠,而是会在原地自旋,直到锁被释放。这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源读写锁:rwlock
2016-04-19 10:31:00 8918
原创 redis服务器模型
redis作为一个数据库,其服务端必须支持海量客户并发,因此必须采用尽可能高效的服务器模型。 redis支持多种IO复用方式,如kqueue、evport、select、epoll。当运行在不同的操作系统上,会选择最合适的IO复用方式。 redis将这些IO复用的调用接口都封装成了统一的接口,当使用时,每次只需要调用统一的接口,程序会根据不同的运行环境选择最合适的底层复用方式。 下
2016-04-18 20:43:10 1607
原创 select & epoll
同步、异步、阻塞和非阻塞区别 同步:发出一个功能调用时,在没有得到结果之前,该调用就不返回 异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回 非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回
2016-04-18 17:12:14 2590
转载 多进程&多线程
原文:http://blog.csdn.net/lishenglong666/article/details/8557215 最原始的博主我没有找到,只能把我从何处转的此篇博文的链接发出来。感觉这篇博文写的很棒,特此转载了 进程、线程有哪些区别1)进程是资源分配的最小单位,同一进程中的线程共享进程的资源,如全局变量 2)线程是调度的基本单位 3)一个进程可以有多个线程 4)进程之间是相互独立
2016-04-17 15:57:33 502
原创 gdb的工作原理
一、gdb简介 gdb:GNU debugger UNIX及UNIX-like下一个强大的命令行的调试工具 gdb调试的整体架构如下图所示: 可以发现gdb调试不管是本地调试还是远程调试,都是基于ptrace系统调用来实现的 ptrace系统调用的原型: 二、ptracelong ptrace(enum __ptrace_request request
2016-04-15 11:03:09 18923 1
转载 如何实现一个malloc
[转] malloc基本实现 <div class="postBody"> <div id="cnblogs_post_body"><p>任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把ma
2016-04-15 09:21:57 544
转载 malloc内存分配原理
一、malloc的工作机制 它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。 调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用free函数时,它将用户释放
2016-04-14 20:15:34 9716
转载 linux网络编程之shutdown() 与 close()函数详解
1.close()函数#include<unistd.h> int close(int sockfd); //返回成功为0,出错为-1. close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数,然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TC
2016-04-14 15:50:05 634
原创 单链表排序----快排 & 归并排序
题目描述: 给定一个乱序的单链表的头节点,对该链表中的节点进行排序 要求时间复杂度为O(nlgn),空间复杂度为O(1) 分析: 由于题目要求时间复杂度我O(nlgn),因此选择排序和插入排序可以排除。 在排序算法中,时间复杂度为O(nlgn)的主要有:归并排序、快速排序、堆排序。 其中堆排序的空间复杂度为(n),也不符合要求,因此也可以排序
2016-04-13 10:48:14 27654 10
转载 一道关于fork的笔试题
下面的这段代码所要我们求的是总共打印出多少个“-”。include <stdio.h>int main(int argc,char*argv[]){ int i; for(i =0; i<2 ;i++) { fork(); //printf("-"); printf("-\n"); } return 0;}
2016-04-12 11:12:42 1456
原创 基本排序算法
排序算法有非常多,主要包括:选择排序、插入排序、冒泡法、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序 In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排序。 Out-place sort:归并排序、计数排序、基数排序、桶排序。 稳定排序:相等元素的相对顺序始终不会发生改变 stable sort
2016-04-12 10:09:47 369
原创 【剑指offer系列】 不用加减乘除做加法___47
题目描述: 写一个函数,求两个整数之和。要求不能使用加减乘除 分析: 既然题目要求不能用加减乘除,那么只能用到位操作了。 0和1 、1和0异或为1, 0和0 、1和1异或为0 0和0 、0和1 、1和0相与为0, 1和1相与为1 因此可以用异或做加法,与操作来计算进位 以3加5为例,3^5=6,3&5=1,则num=6,carr
2016-04-11 20:09:21 304
原创 【剑指offer系列】 圆圈中最后剩下的数字___45
题目描述: 把0 ,1 ,……, n-1这n个数排成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字。 求这个圆圈剩下的最后一个数字 示例: 输入:n=3,m=2,即把0 ,1 ,2这三个数字每次删除第二个,删除的依次为1, 0,剩下2 输出:2 分析: 经典解法,用环形链表模拟圆圈。当链表中只有一个节点时,退出。但是这
2016-04-11 19:57:10 1172
原创 【剑指offer系列】 n个骰子的点数___43
题目描述: 把n个骰子仍在地上,所有骰子朝上一面的点数之和为S。 输入n,输出S的所有可能值的出现概率 示例: 输入:n = 1 输出:S可能为1~6,每个出现的概率相等,均为0.166666 分析: 如果基于递归,可能会有很多重复的操作,因此采用循环来实现。 对于n个骰子,可能6^n种情况。首先统计每个值出现的次数,然后除
2016-04-11 15:13:04 427
原创 【剑指offer系列】 翻转单词 VS 左旋字符串___42
题目描述: 输入一个英文句子,翻转句子中的单词的顺序 示例: 输入: “the sky is blue” 输出:”blue is sky the” 分析: 可以翻转整个句子,然后翻转其中的每个单词。 同时考虑去掉句子中多余的空格(句子首尾不能有空格,单词间只能有一个空格) (leetcode 151) 代码:
2016-04-11 14:44:55 365
原创 【剑指offer系列】 和为S的两个数字___41
题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使它们的和恰好为S。 如果有多对数字的和为S,输出其中任意一对即可 示例: 输入:{1 ,2 ,4 ,7 ,11}和9 输出:2he7 分析: 可以考虑从数组的两端向中间搜索的方式进行查找,这样时间复杂度为O(n) 代码: vector<int
2016-04-11 14:36:43 310
原创 【剑指offer系列】 数组中只出现一次的数字___40
题目描述: 一个数组中除了两个数字只出现了一次外,其它数字都出现了两次。找出这两个数 示例: 输入:{2 ,4 ,3 ,6 ,2 ,3} 输出:4,6 分析: 可以利用相同数字异或为0的思想进行查找 代码: bool isSet(int num,int bit){ return (num&(1<<bit))>
2016-04-11 10:30:05 309
原创 【剑指offer系列】 二叉树的深度___39
题目描述: 输入一棵二叉树,求其深度 。 树的深度定义为:从根节点到叶子节点的路径长度的最大值 示例: 分析: 对每个节点而言,以该节点为根节点的树的深度为左子树和右子树深度的较大值加1. 因此用递归可以很容易的实现 代码: int depth(treeNode *root){ if(root==NUL
2016-04-11 10:06:05 354
原创 【剑指offer系列】 数字在排序数组中出现的次数___38
题目描述: 统计一个数字在排序数组中出现的次数 示例: 输入:数组{1 ,2 ,3 ,3 ,3 ,3 ,4 ,5}和数字3 输出:4 分析: 数组的查找可以利用二分法的思想,分别在数组中找到数字第一次出现和最后一次出现的位置,则出现的次数为二者下标之差 。时间复杂度为O(nlgn). 代码: int getFirst(
2016-04-11 09:59:40 344
原创 【剑指offer系列】 两个链表的第一个公共节点___37
题目描述: 输入两个单链表,找出他们的第一个公共节点。若没有,则返回NULL 分析: 如果两个单链表有公共节点,那么在交点后的每一个节点都是公共的。因此两个单链表的构型必然是下图所示的Y型。 1)利用栈的先进后出,将两个链表的所有节点都入栈。然后再依次出栈。找出最后一个相同节点,即为第一个公共节点.但是这种方法需要两个栈作为辅助空间 2)首
2016-04-11 09:33:28 321
原创 【剑指offer系列】 数组中逆序对___36
题目描述: 输入一个数组,求出其中逆序对的总个数 示例: 输入:{7, 5, 6, 4} ,逆序对有{7,6},{7,5},{7,4},{5,4},{6,4}几种情况 因此输出5 分析: 利用归并排序的思想进行排序,时间复杂度O(nlgn) 代码: int inversePairsCore(vector<int>&
2016-04-10 21:01:19 339
原创 【剑指offer系列】 第一个只出现一次的字符___35
题目描述: 输入一个字符串,找出其中第一个只出现一次的字符 示例: 输入:abacd 输出:b 分析: 首先遍历一次字符串,统计每个字符出现的次数 再次遍历字符串,找到第一个次数为1的字符 代码: char firstOnce(string& str){ int cnt[256]={0}; f
2016-04-10 19:50:41 293
原创 【剑指offer系列】 丑数___34
题目描述: 我们把只包含因子2 、 3 、5的数称为丑数。 求按照从小到大的顺序输出第n个丑数,习惯上把1作为第一个丑数 分析: 1、我们可以通过遍历1到m个数,依次判断是否为丑数,直到找到第n个丑数 但是这种方法包含很多重复的判断,效率非常低 2、创建数组,依次保存已经找到的丑数。由于丑数都是由因子2、 3、 5生成的,因此可以方便的生成每
2016-04-10 19:42:01 313
原创 【剑指offer系列】 把数组排成最小的数___33
题目描述: 输入一个正整数数组,把数组中所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例: 输入:{3 ,32 ,321} 输出:321323 分析: 首先把数组中的每个数字转换成字符串的形式,然后对所有字符串进行排序 排序的规则是:a+b static bool cmp(string& s1,strin
2016-04-10 19:25:42 305
原创 【剑指offer系列】 从1到n中1出现的次数___32
题目描述: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数 示例: 输入12,则包含1的数字有1, 10 ,11 ,12,1共出现5次 输出5 分析: 1. 当从1开始向n遍历每个整数,对每个整数的每一位进行判断时,效率非常低。 2. 首先分析1346到21345中1出现的次数。可以分为两种情况: 1)高
2016-04-10 19:09:36 304
原创 【剑指offer系列】 连续子数组的最大和___31
题目描述: 输入一个整型数组,里面有正数也有负数。 数组中一个或多个连续整数组成一个子数组。 求所有子数组的和的最大值 分析: 采用动态规划,f[i]表示以第i个数字结尾的子数组的最大和,因此所求结果应该为max(f[i]) 当遍历到第k个数时,以nums[k]结尾的子数组的最大和为max(f[k-1]+nums[k],nums[k])
2016-04-10 16:42:57 304
原创 【剑指offer系列】 最小的k个数___30
题目描述: 输入n个整数,返回其中最小的k个数 分析: 1)可以用快速排序的partion算法,当partion返回的索引为k或k-1时,左边的k个数恰好是最小的k个数(会改变原数组) 2)当输入的数据量非常大时,可用堆排序来解决。(适合海量数据) 代码: int partion(vector<int>& nums,int begin
2016-04-10 16:33:14 342
原创 【剑指offer系列】 数组中出现数字超过一半的数字___29
题目描述: 输入一个数组,找出其中出现次数超过一半的数字 分析: 1)首先可以想到利用快排的partion算法,对数组进行排序。 那么最后位于数组中间的那个数字一定是所求的结果。这种方法时间复杂度是O(nlgn) 2)采用计数法,时间复杂度只有O(n) 代码: int moreThanHalf(vector<
2016-04-10 15:31:03 284
原创 【剑指offer系列】 字符串排列___28
题目描述: 输入一个字符串,输入它的所有排列 示例: 输入:abc 输出:abc、acb、bac、bca、cab、cba 代码: void permutate(string &str,int start){ if(start==str.size()) cout<<str<<endl; for(int i=start;
2016-04-10 11:06:49 234
原创 【剑指offer系列】 二叉搜索树与双向链表___27
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。左右孩子指针分别用于双向链表的prev、next指针 要求不能创建任何新的节点,只能调整树中节点指针的指向。 示例: 分析: 由于要求生成的双向链表是排好序的,因此可用中序遍历来遍历这个二叉搜索树。 可将二叉搜索树看成三部分:根节点、左、右子树,先分别将左、右
2016-04-10 10:31:48 305
原创 【剑指offer系列】 复杂链表的复制___26
题目描述: 请实现一个函数,实现复杂链表的复制。 在复杂链表中,每个节点除了有一个next指针指向下一个节点之外,还有一个sibling指针指向链表中的任意节点或者NULL 示例: 一个复杂链表的示例如下: 分析: 1)复制链表中的每一个节点,并用next指针链接 2)为每一个复制后的节点的sibling指针赋值,如A
2016-04-10 09:33:54 335
原创 【剑指offer系列】 二叉树中和为某一值的路径___25
题目描述: 输入一棵二叉树和一个整数,打印出二叉树中节点值之和为输入整数的所有路径 从树的根节点开始往下一直到叶节点所经过的所有节点形成一条路径 分析: 从根节点开始向下遍历,并用一个vector数组记录当前路径的所有节点值。 当遍历到叶子节点时,如果路径和恰好为目标值,则将这个数组加入到返回结果中。 然后继续遍历,直到遍历完所有路径。
2016-04-09 18:11:44 222
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人