- 博客(70)
- 资源 (9)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【转】如何提升你的能力?给年轻程序员的几条建议
入职两个多月了,平时要处理的任务太多,博客都荒废了(又为自己的懒惰找借口了。。。)看到一篇前辈的好文章,讲的很好,转载过来分享给大家。其实,无所谓技术高低,只要肯学习、肯思考、日精进,积累的力量是很大的,但是我们大多数人都败给了惰性。当然,惰性也是人类的本性之一,因为惰性、懒得思考,我们的祖先能少些消耗能量,能在难以获取食物的远古生存下来,呃,扯远了。。。。认清你自己,合理规划时间
2015-09-30 23:25:11
2791
2
原创 查找——图文翔解HashTree(哈希树)
引在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(logn))而已。这些
2015-06-10 00:03:23
49135
8
原创 查找——图文翔解SkipList(跳跃表)
跳跃表跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(logn)平均时间)。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表,因此得名。所有操作都以对数随机化的时间进行。如上图所示,是一个即为简单的跳跃表。传统意义的单链表是一个线性结构,向有序的链表
2015-06-09 00:09:31
10350
2
原创 查找——图文翔解RadixTree(基数树)
基数树对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以实现对于长整型数据类型的路由。利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计
2015-06-08 00:10:31
30322
1
原创 查找——图文翔解Treap(树堆)
Treap=Tree+Heap。Treap本身是一棵二叉搜索树,它的左子树和右子树也分别是一个Treap,和一般的二叉搜索树不同的是,Treap纪录一个额外的数据,就是优先级。Treap在以关键码构成二叉搜索树的同时,还满足堆的性质。这些优先级是是在结点插入时,随机赋予的,Treap根据这些优先级满足堆的性质。这样的话,Treap是有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对于其他的平衡二叉搜索树,Treap的特点是实现简
2015-06-04 00:04:16
19836
2
原创 C语言的角落(二)——你不一定知道的C语言特性
之前写过一篇C的语言的角落,介绍了一些C中的一些非常用特性(http://blog.csdn.net/yang_yulei/article/details/34557625),最近又整理了一些边角的知识,特开此文。switch语句中的case(case 关键词可以放在if-else或者是循环当中)switch (a){ case 1:; // ..
2015-06-03 00:04:33
3592
6
原创 查找——图文翔解SplayTree(伸展树)
伸展树伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它由Daniel Sleator和Robert Tarjan创造,后者对其进行了改进。假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。splaytre
2015-05-27 00:05:04
8541
2
原创 程序的内存布局——函数调用栈的那点事
[注]此文是《程序员的自我修养》的读书总结,其中掺杂着一些个人的理解,若有不对,欢迎拍砖。程序的内存布局现代的应用程序都运行在一个虚拟内存空间里,在32位的系统里,这个内存空间拥有4GB的寻址能力。现代的应用程序可以直接使用32位的地址进行寻址,整个内存是一个统一的地址空间,用户可以使用一个32位的指针访问任意内存位置。在进程的不同地址区间上有着不同的地位,
2015-05-22 00:14:56
20142
7
原创 设计模式的一点总结和思考(一)创建型
面向接口编程对于当前不知道或无法确定的东西,我们就抽象它,只对其接口操作,即现在不知道具体的涉及对象,但我知道如何使用它,先用其接口,待以后知道了具体的对象之后,再绑定上即可,这就是所谓的封装变化。虽然不确定目标是谁,但可以确定如何使用目标。 多种多样的设计模式其实做的就是 封装变化 ,面对不同的情景,分析什么是变化的,什么是不变的,封装变化,使上层代码能够“以不变应万变”。简单工
2015-05-18 12:42:14
1705
原创 警惕缓冲区溢出(C中那些不安全的库函数)
C 和 C++ 不能够自动地做边界检查,边界检查的代价是效率。一般来讲,C 在大多数情况下注重效率。然而,获得效率的代价是,C 程序员必须十分警觉以避免缓冲区溢出问题。C语言标准库中的许多字符串处理和IO流读取函数是导致缓冲区溢出的罪魁祸首。我们有必要了解这些函数,在编程中多加小心。一、字符串处理函数strcpy()strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目!如果源字
2015-05-16 18:15:12
20396
2
原创 以一个简单的项目来学习面向对象编程(设计模式和多线程)
下面的项目是两年前学校老师布置的一个小项目,当时自己用了一种很笨拙的方式实现了,现在用面向对象的思想和多线程重构这个项目。问题描述:西宝高速仿真模拟 西安市到宝鸡市之间是我省主要的高速公路客运路线之一,经过简化后的客运路线端点、中途停靠点和里程如下图所示(括号里是简称,里程的单位是公里): 限定条件 (1) 从XN始发至BJ的客车和从BJ始发至XN的客车均有两种车型:沃尔沃(限定乘客人数为40人
2015-03-09 20:44:45
4917
6
原创 C语言全局变量那些事儿(深入C中最隐秘的地带)
【虽然自认为对C的角角落落都有所了解,但直到看到这篇文章,才知道C中的一些隐秘的坑,是自己之前不知道的。关于全局变量的链接问题,之前在我博客的某文章中有介绍过,一般对C有些了解的程序员都知道这个问题,但本文最后所提到的使用动态链接库所出现的问题,着实让我震惊。(心急的朋友,可跳过前面的,直接读“第4个例子”)所以,以后大家在使用全局变量的时候要留点心,良好的命名规范,在一定程度上可以避
2015-01-31 21:00:43
9175
1
转载 林建:计算机专业学习浅谈
一、广泛了解,从科普书籍开始选择计算机专业的同学,也许是因为原先有一定的基础,也许是因为一时的激情,但更多的人,可能对自己的选择没有深刻的认识,或多或少对计算机专 业有一些神秘的感觉。自己究竟是否喜欢这个学科?才华能够在哪个分支领域有所施展?抑或是真的不适合这个专业?诸多疑问,解决的方法首先便是了解和认识我 们的学科。浓厚的兴趣是学好任何学科的源泉;而广泛的了解则是获得兴趣的途径。当今我们
2014-10-13 23:19:33
1838
转载 人和人最大的差别不是技术上的高低,而是你的人生观价值观
今天看了大家在网上就西邮的学生蔑视交大学生的事情大发感慨,所以想写点东西供大家参考。本人07年硕士毕业,毕业后去了上海在一个外资公司干了三年时间,10年从公司辞职回到西安自主创业,目前有自己的一个小公司。当然也是刚刚起步。谈谈我对与工作的一个体会还有我对于人生的一个观点。记得前两天看《钱学森》的时候钱老在病榻之时说过,想作为一个合格的科技工作者不能埋头于技术本身,还
2014-09-14 19:52:32
2408
原创 面向程序员的设计模式 ——GoF《设计模式》读书总结(壹)抽象工厂&生成器
第一部分:创建型模式创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。(把一些小的对象组装成大对象,这个工作由专门的类对象来做)一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。因为系统定义一个较小的行为集,这些行为可以被
2014-07-31 08:21:44
1603
原创 面向程序员的设计模式 ——GoF《设计模式》读书总结(零)
这个题目很奇怪,设计模式不就是指导程序员进行软件设计的么?呃,我的意思是这是与 面向“对象”的设计模式相对的。以前有看过有人写过《给妻子解释设计模式》,这种把计算机中的思想与生活相结合固然很好。人类解决问题的思想是相通的,计算机中的很多思想比如分治、递归、贪心等都能在生活中找到相似的例子。但是,不恰当的例子反而会误导人的思维,造成理解偏差。设计模式本就是类与类之间如何组织的一套软件设计经验,我们拿
2014-07-30 08:58:01
3499
1
原创 图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)
最近接手了一个项目,其中涉及到MFC和实时曲线显示的问题,由于我之前从未接触过此类技术,现学现搞,把其间用到的觉得对初学者有用的东西,总结一下。尤其是关于TeeChart控件部分,网上资料零碎,且很多不全面,代码难以使用。我苦寻数周在外国一些网站上寻到了一些有用的信息,把相关的可运行的代码示例贴在文中,希望能帮到后来者。 MFC部分:一、分割窗体新建一个单文档的MFC
2014-07-28 08:37:38
38745
30
原创 如何在网络中 传输二叉树森林 (C++源代码实现)
前些日子有朋友遇到这个问题来问我,我觉得有点意思,便实现了代码,写篇文章做个总结,与网友分享。 需求:实现两个API,在客户端:传入一个二叉树的根结点指针,输出可以在网络中传输的ASCII串。在服务器端:根据传入的ASCII串来解析生成一个二叉树,返回二叉树的根结点指针。 思路:看到这个问题,首先想到的是二叉树补全法,将这课二叉树补全,变成一颗完全二叉树,再使用数组进行存储
2014-07-15 08:40:41
4484
原创 《编程珠玑》---笔记。浏览此文,一窥此书。
第一章:磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案。要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案。 比如:文中:最初的需求只是“我如何对磁盘文件排序”。我们首先想到了经典的归并排序。但,进一步了解到排序的内容是10000000个记录,每条记录都是一个7位整数,且只有1M可用的内存。每条记录不相同。 【位示图法,详见我的关于排序
2014-06-30 23:53:01
14531
4
原创 也谈面向对象
OO的三大基础是封装、继承、多态。这三者是有次序性的,没有封装就不可能有继承、没有继承就不可能有多态。 【封装(encapsulation)】封装的目的是要将代码切割成许多模块(module),每个模块之间的关连性降到最低,这么一来比较不会产生“牵一发而动全身”的状况,降低相互依赖的程度,也等于是降低复杂度,可以让开发与维护更容易。事实上,没有人用“模块”一词来称呼封装
2014-06-30 23:29:57
1435
1
原创 C语言的角落——C之非常用特性(一)
本文搜集整理了一些之前博客中没有提到的,C语言不常用的特性,算是对C系列的最后一次补充。对C语言有兴趣的朋友可以浏览一下,查漏补缺。变长参数列表 头文件定义了一些宏,当函数参数未知时去获取函数的参数变量:typedef va_list 宏:va_start()va_arg()va_end() va_list类型通过stdarg宏定义
2014-06-26 08:22:05
4655
1
原创 C之奇淫技巧——宏的妙用
一、指定的初始化很多人都知道像这样来静态地初始化数组:int fibs[] = {1,2,3,4,5} ;C99标准实际上支持一种更为直观简单的方式来初始化各种不同的集合类数据(如:结构体,联合体和数组)。 数组的初始化我们可以指定数组的元素来进行初始化。这非常有用,特别是当我们需要根据一组#define来保持某种映射关系的同步更新时。来看看一组错误码的定义
2014-06-18 08:39:14
11309
7
原创 排序(二)键索引、桶排序、位示图、败者树等(图文详解--败者树)
排序(二)以上排序算法都有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较。我们把这类排序算法称为比较排序。任何比较排序的时间复杂度的下界是nlgn。 以下排序算法是用运算而不是比较来确定排序顺序的。因此下界nlgn对它们是不适用的。 键索引计数法(计数排序)计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为
2014-05-28 08:28:30
8144
3
原创 排序(一)归并、快排、优先队列等(图文详解)
排序(一)初级排序算法选择排序思想:首先,找到数组中最小的那个元素。其次,将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。 【图例】图中,x轴方向为数组的索引,y轴方向为待排序元素的值。 选择排序有两个很鲜明的特点:运行时间和输入无关。为了找出最
2014-05-28 08:28:04
19331
13
原创 查找(二)简单清晰的B树、Trie树详解
查找(二) 散列表散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置。在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标。使用散列的查找算法分为两步。第一步是用散列函数将被查找的键转化为数组的一个索引。我们需要面对两个或多个键都会散列到相同的索引值的情况。因此,第二步就是一个处理碰撞冲突的过程,
2014-05-18 00:05:30
45164
7
原创 查找(一)史上最简单清晰的红黑树讲解
查找(一)我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。键和值的具体意义取决于不同的应用。符号表中可能会保存很多键和很多信息,因此实现一张高效的符号表也是一项很有挑战性的任务。我们会用三种经典的数据类型来实现高效的符号表:二叉查找数、红黑树、散列表。二分查找我们使用有序数组存
2014-05-18 00:05:19
129461
84
原创 Linux 2.x 内核对内存的管理
Linux 2.x 内核对内存的管理其着重点在于分页,用分页的机制把进程间的虚拟地址分隔开来。每个进程都有一套页表,整个系统有一张GDT表(此机制由逻辑地址到线性地址变换,实际上是走了个形式,变换前后地址不变)每个进程都有一套页表用于从线性地址到物理地址的映射变换。这样,每个进程都有一个4GB的逻辑空间。(两进程的逻辑地址相同,但它们有不同的页表,故最终会映射到不同的物
2014-04-24 23:44:31
4212
原创 Linux 0.12 内核对内存的管理
Linux 0.12 内核对内存的管理其着重点在于分段,用分段的机制把进程间的虚拟地址分隔开。每个进程都有一张段表LDT,整个系统有一张GDT表,且整个系统只有一个总页表。 其地址翻译过程为:程序中给出的32位地址(实际上被看做段内偏移地址),再根据代码段寄存器CS中的16位段选择子,可在GDT或LDT中查找相应的段描述符。从段描述符中提取段的基地址,与程序
2014-04-24 23:44:19
3285
1
原创 操作系统内存管理
物理内存Linux为了有效使用机器中的物理内存,在系统初始化阶段内存被划分成几个功能区域:其中,Linux内核程序占据在物理内存的开始部分,接下来是供硬盘等块设备使用的高速缓冲区部分(其中要扣除显卡内存和ROM BIOS所占用的内存地址范围)当一个进程需要读取块设备中的数据时,系统会首先把数据读到高速缓冲区中。当有数据需要写到块设备上去时,系统也是先将数据放
2014-04-24 23:44:02
13785
3
原创 C语言结构体里的成员数组和指针(C语言的一个隐晦角落——关于零数组)
C语言结构体里的成员数组和指针(关于零数组)【转自酷壳网:http://coolshell.cn/articles/11377.html 作者:陈皓】单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如下。我觉得好多人对这段代码的理解还不
2014-04-10 23:50:48
19414
11
原创 CPU的实模式与保护模式(简介)
16位微处理器8086寄存器组成8086/8088包括:4个16位的数据寄存器,2个16位的指针寄存器,2个16位变址寄存器,分成四组。通用寄存器中,这些寄存器除完成规定的专门用途外,均可用于传送和暂存数据,可以保存算术逻辑运算的操作和运算结果。 段寄存器能在8086 中实现1M物理空间寻址,并可与8080 CPU进行兼容。段寄存器都是16位的,分别称为代码
2014-03-30 23:35:48
11938
原创 处理器体系结构(了解CPU的基本运行原理)——《深入理解计算机系统》
处理器体系结构ISA一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA。虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容。因此,ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层。这个概念抽象层即ISA模型:CPU允许的指令集编码,且顺序地执行指令,也就是先取出一条指令,等到她执行完毕,再开始下一条。然而,现代处
2014-03-30 00:02:26
58281
2
原创 UNIX/Linux进程间通信IPC系列(五)信号
信号信号是软件中断。它允许进程中断其他进程。信号是异步处理事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能简单地测试一个变量(例如errno)来判别是否出现了一个信号,而是必须告诉内核“在此信号出现时,请执行下列操作”。一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。每种信号类型都对应于某种系统事件。低层的硬件异常是由内核异常处理程序处理的,正常
2014-03-26 23:41:44
2836
原创 程序的机器级表示——《深入理解计算机系统》
机器级代码计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。对于机器级编程来说,其中两种抽象尤为重要:1、指令集体系结构(Instruction set architecture ISA)它定义了处理器状态、指令的格式,以及每条指令对状态的影响。IA32将程序的行为描述成好像每条指令时按顺序执行的,一条指令结束后,下一条再开始。(实际上处理器并发
2014-03-18 22:51:14
9362
原创 UNIX/Linux进程间通信IPC系列(七)共享内存区
共享存储共享存储允许两个或更多进程共享一给定的存储区。因为数据不需要在客户进程和服务器进程之间复制,所以这是最快的一种IPC。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传递就不再涉及内核。但往该共享内存区存放信息或从中取走信息的进程间需要某种形式的同步。(通常,信号量、记录锁被用来实现对共享存储访问的同步) shmget函数shmget函数创建一个新的共享内
2014-02-28 23:45:27
2606
原创 UNIX/Linux进程间通信IPC系列(六)信号量
信号量信号量(semaphore)是一个计数器,用于多进程对共享数据的访问。为了获得共享资源,进程需要执行下列操作:⑴ 测试控制资源的信号量。⑵ 若此信号量的值为正,则进程可以使用该资源。进程将信号量值减1,表示它使用了一个资源单位。⑶ 若此信号量的值为0,则进程进入休眠状态,直至信号量值大于0。进程被唤醒后,它返回执行第1步。当进程不再使用此共享资源时,该信号量值
2014-02-27 23:48:47
5433
原创 UNIX/Linux进程间通信IPC系列(四)消息队列
消息队列消息队列是消息的链表,存放在内核中并由消息队列标识符标识。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。这跟管道和FIFO是相反的,对后两者来说,除非读出者已存在,否则先有写入者是没有意义的。 管道和FIFO都是随进程持续的,XSI IPC(消息队列、信号量、共享内存)都是随内核持续的。当一个管道或FIFO的最后一次关闭发生时,仍在该管道或
2014-02-23 23:06:34
18818
1
原创 UNIX/Linux进程间通信IPC系列(三)FIFO
FIFOFIFO有时被称为命名管道。管道只能由相关进程使用,但是,通过FIFO,不相关进程也能交换数据。FIFO的路径名存在于文件系统中,一般的文件I/O函数都可用于FIFO。创建FIFO类似于创建文件:#include #include int mkfifo (const char* pathname, mode_t mode) ;其中pathname是一个普通的Un
2014-01-21 23:46:00
4909
原创 UNIX/Linux进程间通信IPC系列(二)管道
管道一般,进程之间交换信息的方法只能是经由fork或exec传送打开文件,或者通过文件系统。而进程间相互通信还有其他技术——IPC(InterProcess Communication)(因为不同的进程有不同的进程空间,我们无法自己设定一种数据结构使不同的进程都可以访问,故需要借助于操作系统,它可以给我们提供这样的机制。IPC) 管道是UNIX系统IPC的最古老的形式,并且所有UN
2014-01-14 20:57:19
2443
TeeChart相关资料(全网最全资料汇集)
2014-07-28
Object-Oriented Programming With ANSI-C
2014-05-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人