自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

转载 python学习之pygname

http://blog.csdn.net/qq_27717921/article/details/53231762

2017-10-29 13:57:44 371

原创 我的秋招之路

秋招不知不觉都快结束了,,今天抽个空总结一下自己秋招的得失, 希望对学弟学妹们有点帮助,不要犯我的过错,同时也是对自己的反思吧。。。当时刚从百度出来,心气也比较高,非滴滴,美团,腾讯,58这些大公司不去,对小公司都看不上,后来才发现自己还是太菜了,,,所以希望学弟学妹们不要学我好高骛远了。。。。。 下面看看我秋招的坎坷之路吧。。。好未来(秋招处女面,挂)好未来的面的都很基础,面试官也很nice。

2017-10-20 22:01:24 737 1

原创 Given an array of non-negative integers, you are initially positioned at the first index of the arra

Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to

2017-10-04 17:11:14 1597

原创 DP:about string

Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s =”aab”, Return [ [“aa”,”b”],

2017-10-02 19:31:26 277

转载 进程和线程的区别?

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线

2017-08-24 13:40:46 375

转载 分治法和动态规划求解最长公共子串

一、动态规划动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。

2017-08-11 19:41:13 1442 1

转载 输出所有的最长公共子序列

问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:输出一个最长公共子序列并不难(网上很多相关代码),难点在于输出所有的最长公共子序列,因为 LCS 通常不唯一。总之,我们需要在动态规划表上进行回溯 —— 从table[m][n],即右下角的格子,开始进行判断:如

2017-06-12 12:18:55 678

原创 指针的引用

什么时候用到指针的引用: 如果需要改变指针本身的值时候,必须用到指针的引用; 但是如果是改变指针所指的内容的时候,不需要用指针的引用,只需要用指针就行了,就是给他一个地址就行了

2017-04-09 15:00:59 344

原创 深信服

深信服面试:昨天深信服面试c/c++, 问的都很基础。 自己打得很菜,感觉还是基础不行;数据结构的东西都忘完了。。。。问了:1.树怎么转成二叉树。 2.二叉树怎么转成双向链表。字符串: 找出两个字符串相同的字符 字符串逆置

2017-04-08 17:57:03 1226

转载 八大排序比较总结

稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序, 这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对 次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其

2016-10-15 13:36:57 744

原创 八大排序--基数排序

基数排序: 将整形10进制按每位拆分,然后从低位到高位依次比较各个位。每次比较完进行排序,直到整个数组有序 主要分为两个过程: (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中) (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中 重复(1)(2)过程,从个位到最高位,直到排好序为止(比如32位无符号整形最大数4294967296,

2016-10-15 13:23:55 362

原创 八大排序--堆排序

堆排序: 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。 其基本思想为(大顶堆): 1)将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无须区; 2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R

2016-10-15 13:17:16 394

原创 八大排序--选择排序

选择排序: 从待排序的序列中选取元素最小的,记录其下标并和序列中为排序的序列开始元素交换,N个元素进行N-1次即可。实现:void select_sort(int *arr, int len){ assert(arr != NULL && len > 0); int min; int index = 0; for(int i = 0; i < len-1; ++i)

2016-10-15 13:09:54 293

原创 八大排序--快速排序

快速排序: 1.从序列中选取一个基准,我一般选0号元素。 2.重新排序序列,使比基准小的元素放在其前面,比基准大的元素放在其后面,这就是一个分区操作。 3.递归把小于基准的子序列和大于基准的子序列排序,直到序列剩一个或没有元素。实现代码:int partition(int *arr, int frist, int last){ int i = frist; int j = l

2016-10-15 13:03:13 312

原创 八大排序--归并排序

归并排序:1.申请空间, 使其大小为两个已经排序的序列之和, 用来存放合并后的序列。 2.设定两个指针指向两序列的开始。 3.比较两个指针所指的元素,选择小的放的合并空间,移动指针。 4.重复3直到某个指针到达序列尾。 5.将剩余的元素拷到合并空间。实现代码:void merge_sort(int *arr, int frist, int mid, int last, int *brr){

2016-10-15 12:52:37 357

原创 八大排序--冒泡排序

冒泡排序:相邻的两个元素进行比较,若从小到大排序,每趟循环后,最大的元素到了最后,n个元素经过n-1次后即可。实现代码:void bubble_sort(int *arr, int len){ assert(arr != NULL && len > 0); int count = 0; for(int i = 0; i < len - 1; ++i) {

2016-10-15 12:42:05 302

原创 八大排序--希尔排序

希尔排序:将待排序的序列分成若干个子序列,每个子序列采用直接插入排序,整个序列基本有序后,整体再来一次插入排序。这是由于插入排序在元素基本有序时,效率较高。 实现代码:void shell_sort(int a[], int n) { int j, gap; for (gap = n / 2; gap > 0; gap /= 2) { for

2016-10-15 12:35:08 337

原创 八大排序--插入排序

插入排序算法: 将第一个数据看作是有序的,第二个到最后一个看成无序; 从头到尾开始扫描未排序数据,将未排序数据插入到相应有序位置的合适位置即可。实现:void insert_sort(int *arr, int len){ assert(arr != NULL && len > 0); int j = 0; int k = 0; int tmp; for(

2016-10-15 11:38:37 370

转载 linux常用查找命令

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索。 which 查看可执行文件的位置 whereis 查看文件的位置 locate 配 合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 1、which 语法: [root@redhat ~]# which 可执行文件名称 例如:

2016-10-06 20:24:27 345

转载 malloc底层实现

malloc 任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的

2016-08-23 08:52:08 1155

原创 const volatile mutable的总结

const 一.一般应用 1.const修饰各种变量的用法. a.取代define #define D_INT 100 #define D_LONG 100.29 ……… const int D_INT = 100; const D_INT = 100; //如果定义的int类型,可省略int. const

2016-08-21 21:44:46 436

转载 一致性哈希算法(consistent hashing)

应用场景: 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法( RoundRobin)、哈希算法( HASH)、最少连接算法( Least Connection)、响应速度算法( ResponseTime)、 加权法( Weighted )等。其中哈希算法是最为常用的算法. 典型的应用场景是: 有 N 台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务

2016-08-17 09:55:23 505

原创 c++封装Rector

最近看了《linux高性能服务器编程》那本书, 上面描述Rector的一张图 对着这图,自己用c++封装了一下, 不知道有什么不足出,请大神们多多指点下。代码如下: 服务器端代码:#include <iostream>#include <unistd.h>#include <cassert>#include <cstdlib>#include <string.h>#include <a

2016-08-10 13:36:01 597

转载 信号及信号处理

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。一、信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事

2016-08-08 22:34:33 779

转载 信号量, 互斥量,自旋锁

一、信号量信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:    (1) 测试控制该资源的信号量。    (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。    (3) 若此信号量为0,则该资源目前

2016-08-08 20:49:48 1502

原创 并发,同步,异步,互斥,阻塞,非阻塞的理解

并发(concurrency):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。 所谓互斥,是指分布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。 所谓同步,是指分布在不同进程之间的若干程序片断,

2016-08-08 18:59:41 2944 1

原创 互斥锁 自旋锁 读写锁 条件变量

互斥锁:同一时刻只能有一个线程进入临界区,一个线程获取锁如果失败,则该线程进入睡眠状态,同一线程多次加锁会造成死锁。 使用场景: 1.持锁时间长 2临界区竞争非常激烈 3 单核处理器

2016-08-05 10:47:58 637

原创 模板实现单链表

今天刚学了模板, 用模板写了个单链表, 不知道还有什么改进的地方,望大神们给点建议。template<typename T>class CLink{public: CLink() { mpHead = new CNode(); } ~CLink() { while(!empty()) {

2016-06-10 22:48:07 403

原创 内联函数和普通函数的区别

1.普通函数在编译后会被放到代码段,然后函数执行过程中调用普通函数是需要先压栈,然后根据函数调用地址调用函数,函数返回后执行出栈操作。这样就会存在一个调用过程,有时间消耗。2.内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率。3.内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。

2016-05-22 19:48:33 1720

翻译 虚拟地址,虚拟地址空间, 交换分区

1.虚拟内存是内存管理的一种方式, 它在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽是充当物理内存来使用。它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间,以此让程序认为自己拥有连续可用的内存。当物理内存不足时,操作系统会将处于不活动状态的程序以及它们的数据全部交换到磁盘上来释放物理内存,以供其它程序使用。2.虚拟地址空间:在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中,这个

2016-05-14 16:38:51 1734

原创 fork, vfork 和 clone

1.fork (1)fork系统调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子进程,fork函数则返回零。 (2)子进程和父进程同时运行, 在复制过程中,子进程复制了父进程的数据段,代码段,子进程改变了父进程的变量时候, 通过copy_on_write(写时拷贝)手段为所涉及的页面建立一个新的副本, 使得子进程对数据的修改不影响父进程。 2.vfork (1)v

2016-05-14 15:47:24 451

原创 二叉排序树的插入和删除

二叉排序树:又称“二叉查找树”,“二叉搜索树”。 二叉排序树是一颗空树,或者具有以下性质: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值.2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值.3.它的左、右子树也分别为二叉排序树。//二叉排序树结构 typedef int ElemType;typedef struct BstNode { Elem

2016-05-08 22:47:25 2138

原创 new和malloc, delete和free的区别

1.new,delete是一个运算符,可以重载. 而malloc和free是一个库函数。2.malloc仅仅是分配一块内存,而new除了分配内存外还调用类的构造函数对对象数据成员初始化, 同理free仅仅是是放一块内存, delete除了释放内存外还调用类的析构函数。3.malloc返回值是void*, new返回类的指针。4.当内存申请失败时, malloc返回NULL, new则抛出一个异常。

2016-05-08 22:06:24 657

转载 tcmalloc

C++自身实现了malloc方法(glibc库的malloc),另外new的底层实现也调用了malloc,而多次进行malloc,free之后会造成大量的内存碎片问题。所以Google分别从空间和时间两个方面实现了tcmalloc,供调用。实际上,tcmalloc也是通过内存池的机制实现,当然Google的工程师们,思考问题比较极致和全面,所以性能也就比较好,但是这毕竟是一个通用的方案,有时为了照顾

2016-05-07 16:04:34 604

原创 线程与进程

进程(用户进程): 1. 有独立的内核栈 2. 有独立的用户空间和地址空间 3. 有pcb线程与进程的唯一区别是: 线程没有独立的地址空间, 线程共享进程的地址空间

2016-05-07 15:44:05 279

转载 virtual

虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性,并且它是软件设计复用的本质,虚函

2016-05-06 21:17:58 388

原创 c++继承和多态

c++继承和多态: 1.普通继承派生类对象的内存布局 class Base { public: void show() const { cout << "Base::show()" << endl; } protected: int ma; };class Derive: public Base{public: void

2016-05-06 20:57:18 651

转载 typedef和define

typedef和#define的用法与区别 一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT;typedef可以增强程序的可读性,

2016-05-05 12:22:52 359

转载 欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2016-05-05 09:26:23 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除