由于一些原因,博主以后的博客更新在csdn,大家可以粉我:http://blog.csdn.net/hanjing_1995
vim是从VI发展而来的一个文本编辑器,功能更强大。而vim.tiny是vim的精简版,所以,安装vim势在必行。同时Windows下程序员很多都很喜欢Source Insight这个工具来看代码,各种语法高亮看着很舒服。vim作为为程序员打造的编辑器,没有道理不可以通过配置让程序员舒服地编辑代码,但是新手通常很难将其配置成顺手顺眼的环境。下面的方法可以通过极其简单的方式把vim配置得跟Source Insight一样炫
我们假设升序排序 排序序列为2000,2001,3000,4000 遍历序列,取出最小值min,最大值max,开辟一个空间为max—min的空间大小的数组,遍历数组a将排序序列a中的每个元素出现的次数放在数组count的每个a[i]-min处。就是说,2000出现一次了,把次数1放在2000-2000位置处,2001出现的次数放在2001-2000位置上,3000出现的次数放在3000-2000位置上,4000出现的次数放在4000-2000位置上,5000出现的次数放在5000-2000位置上。后面遇到相同元素了,那将该位置处的次数加加就统计出每个元素的次数了。 这样,对于数组count,里面放的元素就是序列a的次数,count的下标就是a的元素。 往出来取元素的过程,就是拿出排序好的序列的过程。每次从数组count里拿出下标,放回去就可以了。如果此时count中的元素大于1,说明排序序列a有重复元素,那我们多拿几次就行了。
快速排序的挖坑法与prev、cur法,我们在上一篇博客的第6个排序中讲的非常详细,http://10740184.blog.51cto.com/10730184/1774508【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序) 有兴趣的话,相信聪明的你,一看就会秒懂快速排序的思想。 下面,我们将快速排序优化: 1、三数取中来优化快速排序
Linux中的Find指令是Linux系统中很重要也是很棒的指令之一,功能非常得强大。下面我根据实例代码向大家分享find指令。由于博客上无法贴出Linux代码,我就在截图中体现出代码,以及效果。 我先自己创建了文件名的test.c的普通文件,我们用指令mkdir,以及ls查看已经创建了test.c.
直接插入排序: 在序列中,假设升序排序 1)从0处开始。 1)若走到begin =3处,将begin处元素保存给tmp,比较tmp处的元素与begin--处元素大小关系,若begin处<begin-1处,将begin-1处元素移动到begin;若大于,则不变化。再用tmp去和begin--处的元素用同样的方法去作比较,直至begin此时减少到数组起始坐标0之前结束。 3)以此类推,依次走完序列。
用两个栈实现一个队列,这个问题与“两个队列实现一个栈”原理非常的相似。只要你明白了”两个队列实现一个栈“的原理,相信聪明的你,就会明白这个问题只是它的变种,所有的异或就会迎刃而解的。这里大家可以参考我的博客http://10740184.blog.51cto.com/10730184/1763006
我们先给出之前我看过的腾讯公司的一道笔试题,引出位图BitMap。 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 这个问题怎么解决呢? 1)将40亿数据保存起来(保存在数组、链表、树中),再和该数判断是否相等。 那我们思考一下需要多少内存: 2)借助位图BitMap解决。
从尾到头打印单链表void FromTailToHeadPrint(SListNode*& head) { stack<SListNode*> s; SListNode* cur = head; &n
C语言:输入一个整数,输出该数二进制表示中1的个数。
现哈希表时,我们常见的方法是线性探测、二次探测,这两个算法也很简单。若有兴趣,可以查看我的博客。但是,这两个算法有一个共同点就是:空间利用率低。为什么这么说呢?线性探测、二次探测的高效性很大程度上要取决于它的载荷因子,载荷因子即:存放关键字个数/空间大小。
构造哈希表常用的方法是: 除留余数法--取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。HashKey= Key % P。 直接定址法--取关键字的某个线性函数为散列地址HashKey= Key 或 HashKey= A*Key + BA、B为常数。 我在这里主要使用一下除留余数法Hash(key) =Key%P,(P这里是哈希表的长度)p最好是素数考虑降低哈希冲突的原因,我并没有在这上面过于追究此处哈希表长度10,见线性探测图。 哈希表经常遇到的一个问题就是哈希冲突。 哈希冲突是什么呢?哈希冲突指的是:不同的关键字经过相同的哈希函数映射到相同的的哈希地址处。 要解决哈希冲突闭散列方法主要有两个:线性探测与二次探测。 在这里,我将线性探测的原理用下图表述:
静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
假若将一个序列升序排序好,那么我们来考虑最大堆还是最小堆来排序。假若是最小堆的话,堆的顶端必定是堆中的最小值,这样貌似可以。但是,如果是它的(一边或)子树左子树的节点数据值大于(一边或)右子树的节点数据值,直接打印肯定是错误的,而且对于此时的堆我们也无法操控来调整好正确的顺序了。 那我们换成最大堆来实现升序想,当我们把序列调整成为最大堆后,最大堆顶端的数据值是最大的,然后我们将这个最大值与堆的最后一个叶子节点值来进行交换,再将交换后的顶端值进行调整,换到合适的位置处……重复这样的工作,注意:进行第2次交换就要将顶端元素值与倒数第2个节点元素值交换了,且调整顶端元素位置也不能一直调整到size-1处。(因为:size-1处的值已经是最大)
我们举例,假若从10000万个数里选出前100个最大的数据。 首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女节点),然后再将后面的剩余数据若符合要求就插入堆中,不符合就直接丢弃该数据。 那我们现在考虑:确定是该选择最大堆的数据结构还是最小堆的数据结构呢。 分析一下: 若选用最大堆的话,堆顶是堆的最大值,我们考虑既然要选出从10000万个数里选出前100个最大的数据,我们在建堆的时候,已经考虑了最大堆的特性,那这样的话最大的数据必然在它顶端。假若真不巧,我开始的前100个数据中已经有这10000个数据中的最大值了,那对于我后面剩余的10000-100的元素再想入堆是不是入不进去了!!!所以,选用最大堆从10000万个数里选出前100个最大的数据只能找出一个,而不是100个。 那如果选用最小堆的数据结构来解决,最顶端是最小值,再次遇到比它大的值,就可以入堆,入堆后重新调整堆,将小的值pass掉。这样我们就可以选出最大的前K个数据了。
代码按照适配器模式实现,若理解了堆的内部怎么实现的,那优先级的队列实现则是非常简单的了,堆的设计大家不明白的话,可以查看我的博客http://10740184.blog.51cto.com/10730184/1767076。
在数据结构里,堆是一类很重要的结构。堆结构是一组数组对象,我们可以把它当作是一颗完全二叉树。 最大堆:堆里每一个父亲节点大于它的子女节点。 最小堆:堆里每一个父亲节点小于它的子女节点。 如图就是一个最大堆:
对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对 于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一 点。 二叉树前序:访问根节点->左子树->右子树 (1)递归写法: 依次访问根节点、左子树、右子树,注意递归出口的结束。
二叉树:树的每个节点最多有两个子节点。 我们看下它的结构,有二叉链表结构与三叉链表结构,具体结果如我摘自《C++Primer》中的图。 (1)求二叉树的叶子节点数leafsize: 叶子节点指的是,节点无子女节点。我们有两种思路: 1)设置一下全局变量或者静态变量的size,遍历二叉树,每次遇到一个节点就加加一次size 2)总叶子节点数就等于左子树叶子节点个数+右子树叶子节点个数+根节点个数1
strcpy:拷贝源字符串到子字符串,包括‘\0’。 strncpy:strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。 strcat:作用是链接字符串. strcmp: 用来比较字符串长度。 对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。 如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。 返回值: (1)字符串1=字符串2,返回0 (2)字符串1>字符串2,返回一个正整数 (3)字符串1<字符串2,返回一个负整数。
我们先定义它的结构: (1)它有三种节点,头节点、值节点、子表节点。 (2)两种指向下一节点的指针:指向下一值值节点的指针_next,指向子表节点的指针_sublink.
在矩阵中,有一类很重要的矩阵,就是-----稀疏矩阵。 所谓的稀疏矩阵呢,就是指的是,在矩阵中,有效的数据个数远远小于无效的数据个数(并且这些数据排列顺序没有规律)。 有效数据个数仅仅6个,其余都为无效数据0. 那我们将稀疏矩阵存在压缩矩阵中,设定一个三元组,使用{row,col,value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。 我们建立一个结构 矩阵的转置: 将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。 对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。 对称矩阵与压缩矩阵的关系是: 对称矩阵SymmetricMatrix[i][j] =压缩矩阵Array(i*(i+1)/2+j)。 spacer.gif下面我实现一下对称矩阵存储在压缩矩阵以及将压缩矩阵中的元素还原成对称矩阵打印出来的代码。
思路一: 我们设定s1是入栈的,s2是出栈的。 入队列,直接压到s1即可 出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素; 再把s2的剩余元素全部倒回s1中。 思路2: 入队列时: 如果s1为空,把s2中所有的元素倒出压到s1中 否则直接压入s1 出队列时: 如果s2不为空,把s2中的栈顶元素直接弹出 否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素 思路3: 我们设定s1是入栈的,s2是出栈的 入队列:直接压入元素至s1即可 出队列:如果s2不为空,把s2中的栈顶元素直接弹出 否则,把s
迷宫入口是坐标(2,0)位置,出口是(9,3)。我们假定0代表通路,1代表不通。 现在需要找到哪一条路是通路。我们的思想是借助栈,“回溯法”。回溯是什么意思呢???先从起点出发,检查它的上下左右是否是通路(即是否有为数字0处)。也就是说为0通了,压栈,将此位置元素变成2,这样做的好处是明确通路路径。然后继续往下走,判断上下左右 。直至我们找到终点(纵坐标在矩阵的最后一行)。
意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡. 问:一对兔子,一年能繁殖成多少对兔子?题中本质上有两类兔子:一类是能生殖的兔子,简称为大兔子;新生的兔子不能生殖,简称为小兔子;小兔子一个月就长成大兔子.求的是大兔子与小兔子的总和。 如果用 un 表示第 n 月的大兔对数,则有 un = un-1 + un-2, n >2每月大兔对数un 排成数列为:1,1,2,3,5,8,13,21,34,55,89,144,• •• 此数列称为斐波那契数列. 月 份 ⅠⅡ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ 大兔对数 1 1 2 3 5 8 13 21 34 55 89 144 小兔对数 0 1 1 2 3 5 8 13 21 34 55 89 到
RAII(Resource Acquisition Is Initialization): 资源分配即初始化,定义封装一个类,用来实现调用构造函数时就可完成资源的分配和初始化,在调用析构函数就可完成资源的清理,以实现对资源的初始化和清理。 智能指针: 用自动化或者说智能的指针来实现对动态内存的释放。 它是一个类,有类似指针的功能。 常见的智能指针有:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,我们今天先讲以下三种。
类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,它与类封装的区别是,我们并不用知道我 们所调用的对象是什么类型,类型萃取是编译后知道类型,先实现,而类的封装则是先定义类型,后实现方法。在这里我们可以用模板的特化实现其编程思想。 我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我们则需要在堆上开辟空间,所传递的指针如 果被直接复制,则有可能(vs下的string类型的实现原理是若字符串不长则以数组保存,若字符串过长,则通过指针在堆上开辟空间进行保存)出现同一地 址,析构两次这样的常见错误。 我们知道,类型分为基本类型(POD),和自定义类型。基本类型指在C++ 中与C兼容的类型,可以按照 C 的方式处理。而自定义类型如我们今天实现的静态顺序表。
伴随着电脑产生的行业IT行业的发展成为了人们关注的重点,在未来的几十年里,如果没有出现新兴的行业,那么IT行业将会成为主导。现阶段IT行业还处于发展之中,每年这个行业的就业人员也在逐年增多。本文我通过对IT行业的就业现状、就业前景、就业趋势这三个方面做了研究。
适配器: 将一个通用的容器转换为另外的容器,所谓的容器,指的是存放数据的器具,像我们知道的顺序表和链表都是容器Container。举个例子解释一下吧,我们的电压都是220v,而像充电线就起到转换到合适的电压的作用。而这里,我们的主角就是将通用的链表结构转换为来实现队列Queue这一数据结构,(意思就是,链表还可以去实现其他的数据结构)。 在线性表中,分为链表和顺序表,我们知道其中的差别: 链表:节点灵活,使得插入删除元素方便灵活,但是对于单链表若有节点指针_head、_tail,查找元素较为麻烦,需要遍历。 顺序表:开辟一块连续的内存空间,查找元素方便,通过指针或者下标来访问。插入或者删除元素呢,又较为复杂,插入时需要将后面的元素挨着挨着全部后移,删除元素后又需要将后面的元素全部前移。 针对队列Queue模型,我们知道它是尾插头删、先进先出的特点。因此我针对以上原因选用链表结构来实现队列Queue。可以参照下图:
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号