- 博客(1069)
- 资源 (3)
- 收藏
- 关注
原创 longest valid parentheses--LeetCode
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.For "(()", the longest valid parentheses substring is "()", whic
2015-03-25 16:59:35 799 1
原创 Merge k sorted list--LeetCode
题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.思路:对于合并K个排好序的链表,最好的方法就是使用一个K个元素的最小堆,每次选择堆顶元素作为新的元素,等到K个元素均为空,说明所有的插入都已经结束。不过这里也可以使用K个
2015-03-24 20:42:24 960
原创 sort list--LeetCode
Sort a linked list in O(n log n) time using constant space complexity.看到O(n log n)的排序算法,适合单链表的首先想到的就是归并排序达到这个复杂度的排序算法,对于单链表来说,最合适的就是 #include #include using namespace std;/*对于链表的排序 使用归并排序
2015-03-24 19:28:11 780
原创 Remove elements--LeetCode
题目:Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the new len
2015-03-24 16:46:05 1102
原创 Remove Nth node from End of list--LeetCode
题目:Given a linked list, remove the nth node from the end of list and return its head.For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from t
2015-03-24 15:22:51 709
原创 Reorder List --LeetCode
题目:Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…You must do this in-place without altering the nodes' values.For example,Given {1,2,3,4}, reord
2015-03-24 14:48:27 1016
原创 C语言的字节对齐 #pragma pack(n)2
#pragma pack(n)解释一:每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据
2015-03-23 15:10:35 4457
原创 STL源码剖析—整体简要概述
STL源码剖析—简要概述首先需要明白STL内部各个组件以及组件之间的关系,STL号称是泛型编程的典范,泛型编程不仅仅是模板的高级应用,这里更多体现了整体的设计思想。空间配置器、迭代器、容器、算法、仿函数、适配器,共六大组件,其中这里比较关心的就是前四个。这里面涉及了模板、模板的偏特化、模板的特化。所有的操作都是为了更高的效率而存在的。一、空间配置器对于一个STL的模板库来说,空间的
2015-03-23 14:57:17 895
原创 hadoop学习笔记--hadoop读写文件过程
读取文件: 下图是HDFS读取文件的流程: 这里是详细解释: 1.当客户端开始读取一个文件时,首先客户端从NameNode取得这个文件的前几个block的DataNode信息。(步骤1,2) 2.开始调用read(),read()方法里,首先去读取第一次从NameNode取得的几个Block,当读取完成后,再去NameNode拿下一批Block的
2015-03-09 21:14:50 1665
原创 hadoop学习笔记--NameNode和DataNode以及容错处理
概念:HDFS会把一个很大的文件分块(与传统的文件系统类似),存放在不同的DataNode上。不过这个块是个逻辑概念,比较大,默认是64M。Hadoop以“管理者-工作者”模式运行。NameNode就是管理者,它保存了文件系统中所有文件以及目录信息。也记录了每个文件的分块信息。但这些分块具体在哪些机器上存储则由DataNode自己上报。容错:NameNode的容错:所有的文
2015-03-09 21:14:06 2002
原创 hadoop学习笔记--哪些场景不适合 哪些场景适合
Hadoop不是万能的,有些场景适用,有些不适用。Hadoop设计的目的主要包括下面几个方面,也就是所谓的适用场景:1:超大文件 可以是几百M,几百T这个级别的文件。2:流式数据访问 Hadoop适用于一次写入,多次读取的场景,也就是数据复制进去之后,长时间在这些数据上进行分析。3:商业硬件 也就是说大街上到处都能买到的那种硬件,这样的硬件故
2015-03-09 21:12:48 2381
转载 深入剖析STL GCC 4.4的STL string
本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。平台:x86_64-redhat-linuxgcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)1. 问题提出最近在我们的项目当中,出现了两次与使用string相关的问题。1.1. 问题1:新代
2015-03-09 19:47:00 1776
原创 static inline volatile的作用
1、static (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容[cpp] view plaincopychar a = 'A'; // global
2015-03-09 19:34:51 1242
原创 C++ const引用、临时变量 引用参数
C++引用—临时变量、引用参数和const引用如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器在下面两种情况下生成临时变量: 实参类型是正确的,但不是左值 实参类型不正确,但可以转换为正确的类型左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和被解除引用的指针都是左值,非左值包括字面常量和包含多项式
2015-02-05 11:48:25 6098
原创 Linux驱动开发--linux下的DMA编程
DMA编程DMA是一种无需要CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率DMA方式的数据传输由DMA控制器控制,在传输期间,CPU可以并发地执行其他任务,当DMA结束后,DMA控制器通过中断通知CPU数据传输已经结束,然后由CPU执行相应的中断服务程序进行后序处理.DMA可以用做内
2015-02-01 20:14:02 8271
原创 linux驱动开发--I/O内存的访问流程
设备通常会提供一组寄存器来用于控制设备、读写设备和获取设备状态,既控制寄存器、数据寄存器和状态寄存器、这些寄存器可能位于I/O空间,也可能位于内存空间。当位于I/O空间时,通常被称为I/O端口,位于内存空间时,对应的内存空间被称为I/O内存(现在一般都是统一编址)1、对于I/O端口有专门的函数提供读取端口上的数据,例如读写字节端口(8字节宽)Unsigned inb(unsigned
2015-02-01 17:28:17 2048
原创 Linux中虚拟内存和物理内存的关系
首先,让我们看下虚拟内存:第一层理解1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分
2015-01-29 16:43:03 1693
原创 Linux下信号种类以及特殊信号的含义
可看到Linux支持的信号列表:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV
2015-01-29 15:52:02 3504
原创 Linux中volatile关键字的作用
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:
2015-01-29 15:05:09 3045 1
原创 linux中的exit()和_exit()函数区别
exit和_exit函数都是用来终止进程的。当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。但是,这两个函数是有区别的。 exit()函数的作用是:直接使用进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;_exit()函数则在这一基础上做了一些包装。在执行退出之前加了若干道工序。exit()函数与
2015-01-29 09:54:28 1114
原创 将二叉树转化为双向链表
递归解法:(1)如果二叉树查找树为空,不需要转换,对应双向链表的第一个节点是NULL,最后一个节点是NULL(2)如果二叉查找树不为空:如果左子树为空,对应双向有序链表的第一个节点是根节点,左边不需要其他操作;如果左子树不为空,转换左子树,二叉查找树对应双向有序链表的第一个节点就是左子树转换后双向有序链表的第一个节点,同时将根节点和左子树转换后的双向有序链 表的最后一个节点连接;
2015-01-29 08:50:43 2056
原创 linux内核--段页式管理内存的方法
一、概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不
2015-01-28 19:50:28 3531
原创 红黑树插入删除节点过程分析 && C代码实现
红黑树的插入和删除规则:红黑树的五个性质1、 每个节点要么是红的,要么是黑的2、 根节点时黑色的3、 每个叶节点(叶节点既指树尾端NIL指针或NULL节点)是黑色的4、 如果一个节点时红的,那么它的两个儿子都是黑色的5、 对每个节点,其到叶节点树尾端NIL指针的每一条路径都包含相同数目的黑节点这里所说的“叶节点”或者“NULL节点”,它不包
2015-01-28 13:42:23 1566
原创 深度优先搜索 && 广度优先搜索
类比二叉树先序遍历与图深度优先搜索在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法.二叉树的前序遍历算法: void TreeWalk(node* root) { if(root) { visit(root);
2015-01-27 19:37:06 1084
原创 二叉搜索树的创建 && 查找 & 插入 & 删除
二叉搜索树的删除:在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除。分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点void Delete(BinTree*& root,int value){ BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp
2015-01-19 10:47:55 1077
原创 相邻元素差的绝对值都是1,在这样的数组中找目标元素
有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?这道题目的解法非常有趣。数组第一个数为array[0],要找的数为y,设t = abs(y - array[0])。由于每个相邻的数字之差的绝对值为1。故第t个位置之前的数肯定都比y小。因此直接定位到
2015-01-18 17:00:36 2934
原创 二路归并 && 插入归并 && 原地归并
插入归并归并排序的时间复杂度为O(nlgn),空间复杂度为O(n);但是一般来讲,基于从单个记录开始两两归并的排序并不是特别提倡,一种比较常用的改进就是结合插入排序,即先利用插入排序获得较长的有序子序列,然后再两两归并(改进后的归并亦是稳定的,因为插入排序是稳定的)。之所以这样改进是有原因的:尽管插入排序的最坏情况是O(n^2),看起来大于归并的最坏情况O(nlgn),但通常情况下,由于插
2015-01-17 17:38:32 1688
原创 Trie树的详解及应用
Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 Trie 的强大之处就在于它的时间复杂度。它的插入和查询时间复杂度
2015-01-14 20:21:48 1638
原创 一串首尾相连的珠子(m个),有N种颜色(N<=10),使得最短的字符串包含全部颜色
思路:先从index=0处搜索,每检查一颗珠子,响应的颜色数量+1,如果是新的颜色则总颜色数+1. 当颜色总数为n时,找到第一个满足条件的连续序列。 1>从该序列起始处搜索,若搜索处的颜色数量不为1,则表明该串还有别的珠子有该颜色,继续往前搜索并更新该序列,起始索引位置+1.
2015-01-14 19:27:33 2597 1
原创 链表的归并排序
因为链表是节点式存储,不能做到随机存储,但是对于两个有序链表之间的合并不需要额外的空间,在O(1)空间复杂度O(n)时间复杂度内即可完成。所以对于链表排序,使用归并排序比较划算。typedef struct Node List;struct Node{ int value; List* next; }; //链表节点结构体首先合并两个
2015-01-14 18:05:09 1124
转载 位操作基础篇
转载:http://blog.csdn.net/morewindows/article/details/7354571在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。因此本
2015-01-14 14:40:20 743
转载 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
划分为m块时,需要具备的条件:m的取值为1~n每一部分之和为 sum/m; (sum为数组元素之和)sum % m == 0,否则不可能平分递归思想:假设分为m块,每一块之和即为subSum = sum / m。subSum即为每一块元素之和。如果array[i]在某一个块中,则需要在数组的其中元素中找出和值为(subSum - array[i])的组合。利用boo
2015-01-14 11:43:10 3345
转载 为什么只给出前序和后序,不能唯一确定一个二叉树
我们在学习二叉树的遍历时,都会不可避免的学到二叉树的三种遍历方式,分别是遵循(根-左-右)的前序遍历、遵循(左-根-右)的中序遍历以及遵循(左-右-根)的后序遍历。并且每一个二叉树都可以用这三种遍历方式并且分别转换为字符串序列,以便在计算机上面保存。但是我们在进行逆向操作的时候却会遇到困难:我们并不能从某一种遍历方式推断出唯一的二叉树,也就是说,这是个单向编码的过程。而当我们有一个二叉树的两种遍历
2015-01-13 22:55:52 14017 5
原创 由二叉树的前序遍历和中序遍历来求后序遍历的结果
假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。PreOrder: GDAFEMHZInOrder: ADEFGHMZPostOrder: AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该
2015-01-13 22:52:19 1100
原创 多线程读取全局变量 (在无锁状态下 会造成多少种值的出现)
int global = 0;// thread 1for(int i = 0; i < 10; ++i)global -= 1;// thread 2for(int i = 0; i < 10; ++i)global += 1;之后global的可能的值是多少(多种可能)? 这个问题考虑的是全局变量global的加减操作不是原子操作,在加减过程中有可能被打断,从而产生
2015-01-13 19:45:03 4394 1
转载 比较排序算法
比较排序算法分类比较排序(Comparison Sort)通过对数组中的元素进行比较来实现排序。比较排序算法(Comparison Sorts)CategoryNameBestAverageWorstMemoryStability 插入排序 (Insertion Sorts)
2015-01-13 17:33:28 1040
原创 小白鼠试毒药,最少需要多少即可试出结果
有 1000 桶酒,其中 1 桶有毒。而一旦吃了,毒性会在 1 周后发作。现在我们用小老鼠做实验,要在 1 周内找出那桶毒酒,问最少需要多少老鼠。一只老鼠喝酒后又两种状态:死(0)和活(1).所以10只老鼠就能表示2的10次方个状态(即1024个)。2^0表示2的零次方。2^8表示2的8次方。设有10只老鼠编号分别为2^0,2^1, 2^2, 2^3, 2^4, 2^5,
2015-01-13 14:27:37 4010
原创 利用随机函数生成随机数
给定一个rand(),可以产生从0到RAND_MAX的随机数,其中RAND_MAX很大(常见值:16位int能表示的最大整数32767),写出利用rand()生成[a,b]中任意整数的函数,其中a>=0, b分析:这是在编程工作最常见的随机函数的应用,在这里做一个起点再合适不过。把随机数区间的起点从0变为a,同时把一共RAND_MAX+1个数的区间缩小至只含有b-a+1个数的区间,写为 a
2015-01-11 09:01:53 3965
原创 等概率无重复的从n个数中选取m个数
问题描述:程序的输入包含两个整数m和n,其中m学习过概率统计的同学应该都知道每一个数字被抽取的概率都应该为m/n. 那么我们怎么构造出这样的概率呢?在《编程珠玑》上面是这样解析的: 依次考虑整数0,1,2,.....,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,我们可以保证输出结果是有序的。 假如我们考虑m = 2,n = 5的情况,那么选择的每一个数字的概率都
2015-01-11 08:57:27 20868
原创 使用Easybcd 安装双系统 windows+ubuntu
1)安装Easybcd2)稍等会运行 EasyBCD,以后自己在桌面上双击运行,在第一步要选择“简体中文”,然后点“Go”继续; 接下来的版权提示点“确定”继续; 3)在出来程序窗口左侧栏,点击“添加新条目”; 4)然后在右侧出来一个面板,点最右边的“NeoGrub”标签,再点它下边的“安装”按钮; 5)稍等安装完成,再点击它
2015-01-09 16:00:37 5334
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人