自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wjhdd的博客

汪嘉豪的博客,记录我的学习历程。

  • 博客(54)
  • 收藏
  • 关注

原创 grep,awk,sed简单用法

grepgrep是一种强大的文本搜索工具,他能使用正则表达式搜索文本,并把匹配的行统计出来。 命令:grep [选项] [–color=auto] ‘搜索字符串’ filename 常用参数: -c:统计符合条件的字符串出现的次数。 -E:支持扩展正则表达式。 -i:忽略字符大小写。 -n:在显示匹配到的字符串前面加上行号。 -v:显示没有”搜索字符串”内容的那一行。

2017-08-26 11:12:25 556

原创 排序合集

排序算法大体可分为两种:     一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。     另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。     排序算法的稳定性:保证排序前后两个相等的数的相对顺序不变。冒泡排序它重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的

2017-08-06 16:53:38 543

原创 设计模式之单例模式

什么是设计模式Patterns,顾名思义,具有某种重复性规律的方案。Design Patterns,就是设计过程中可以反复使用的、可以解决特定问题的设计方法。 他并不是某种特定的方法,而是一种解决问题的思维。设计模式六大原则1. 开闭原则 意思:软件模块应该对扩展开放,对修改关闭。 举例:在程序需要进行新增功能的时候,不能去修改原有的代码,而是新增代码,实现一个热插拔的效果(热插拔:灵活的

2017-08-01 17:25:15 332

原创 死锁及如何避免死锁

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须

2017-07-23 16:19:19 600

转载 当你打开一个网站的时候,都发生了什么

原文:这是原文地址1. 首先嘛,你得在浏览器里输入要网址:2. 浏览器查找域名的IP地址导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。系统缓存 –

2017-07-23 12:07:02 3561 1

原创 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5。

链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k).思路:取出长度为k的链表将其翻转,在链接到链表里。#include using namesp

2017-07-23 11:13:02 997

原创 二叉树实现及基本操作

什么是二叉树在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树。二叉树的子树有左右之分,并且次序不能任意颠倒。

2017-07-22 10:49:14 709

原创 文件描述符

什么是文件描述符在linux下一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,它是一个非负整数,用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符完成的。 在linux中,进程是通过文件描述符(file descriptors 简称fd)来访问文件的,文件描述符实际上是一个整数。在程序刚启动的时候,默认有三个文件描述符,分别是:0(代表标准输入),

2017-06-03 20:26:27 7936

原创 进程的状态

Linux进程状态:R (TASK_RUNNING),可执行状态。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。Linux进程状态:S (TA

2017-06-03 10:41:57 635

原创 task_struct(进程描述符)

进程是一个正在执行的程序。 进程是程序的一个运行实例。 进程能分配处理器并由处理器执行的实体。 如果从内核的角度看的话:进程是分配系统资源的单位。当一个程序被加载到内存之后并为他分配一个PCB(进程控制块),这时候就称为进程了。在linux中PCB就是一个名字叫做task_struct的结构体,我们叫他”进程描述符”。它里面有进程执行的所有信息,所以CPU对task_struct进行管

2017-05-29 09:51:47 634

原创 进程与线程的区别

最近学到操作系统,觉得很有必要把进程与线程的概念搞清楚。首先我们先从大的方面谈谈cpu——进程——线程:cpu是计算机的核心,他承担了计算机所有的任务。单个cpu只能运行一个任务。进程是一个动态概念,它代表cpu所能处理的单个任务。cpu总是运行一个进程,当一个进程运行时,其他的进程就处于非运行状态。一个进程里可以有多个线程,一个进程的内存空间是共享的,意思就是所有的线程可以共享这块内存空

2017-05-29 09:04:18 783

原创 new delete与malloc free的区别

相同点:都可用于申请动态内存和释放内存。不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,

2017-05-14 10:16:40 1142 3

原创 malloc free 解析

首先看一下malloc和free的基本概念void *malloc(long NumBytes);该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 void free(void *FirstByte);该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 简单用法: /

2017-05-14 10:02:16 1149

原创 new delete 解析

new和delete是什么程序运行时,计算机的内存被分为4个区域:程序代码区,全程数据区,栈和堆。其中堆上的内存可以被用户自由分配和释放。C语言中提供了malloc(还有calloc和realloc)和free函数来进行动态内存管理。C++中则提供了new和delete运算符来进行动态内存管理。因为new和delete是运算符,所以性能要更高效(没有函数调用时的开销),使用更灵活。

2017-05-13 12:07:45 1187 3

原创 静态成员和静态成员函数

一,静态数据成员静态数据成员是一种特殊的数据成员,它以关键字static开头。静态数据成员是不属于某一个对象的,它属于所有这个类的对象,或者说它属于这个类。静态数据成员在内存中只占一份内存单元。每个对象都可以引用这个静态数据成员,静态数据成员对所有对象都是一样的。1、如果只定义了类,而未定义对象,则类的一般数据成员是不占内存空间的,但是静态数据成员不同,因为它不

2017-05-13 11:20:17 688

原创 运算符重载

一.什么是运算符重载:C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。二.运算符重载的实质:运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的

2017-05-13 10:30:34 1290

原创 函数的重载,重写,隐藏

重载:1、在同一作用域中。2、函数名相同、参数个数或参数类型不同,返回值可同可不同。3、重载又称为静态多态,静态绑定,静态决议等。因为要实现重载,所以C++和C的命名方式有所不同。重载主要是为了减轻程序员对函数名的记忆负担,让所有功能相似的函数使用同一名字。4、任何程序都仅有一个 main 函数的实例。main 函数不能重载。5、函数重载和重复申明的区别:如果两个函

2017-05-13 09:58:30 745

原创 指针和引用的区别

关于指针的博客前边写过,可以去看看:点击打开链接今天只要看看引用的知识:什么是引用:"引用"是C++中引入的新的变量类型,它的作用是为一个变量起一个别名。int a=10;int &b=a;b是a的引用,即b是a的别名,a和b的作用相同。对a所进行的操作的结果与对b所进行的操作结果是完全相同的。声明b为引用类型并不需要为b另外开辟空间来存放b,a和b代表同一块空间

2017-04-19 11:11:42 713

原创 指针的问题

今天我们来看看指针的问题:指针:用来保存地址的“变量”叫做指针。你可以理解为指针就是地址。如何定义一个指针:int a = 1;int *p = &a;p现在是a的指针,对p进行*(解引用)就是a的值1。指针常量:*(int *)10 = 100;意思就是我们将10强转成int *类型的整形地址,再对其就行*(解引用)就拿到一块空间,然后再对其赋值。常

2017-04-19 10:12:27 1110

原创 HTTP和SOCKET中长连接与短连接的区别

TCP/IP TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。;在应用层有:通过TCP协议来通信的应用层协议包括FTP、HTTP、TELNET、SMTP等 ;                  通过UDP协议来通信的应用层协议包括DNS、TFTP等

2017-04-04 11:08:10 1312

原创 浅谈HTTP中get与post的区别

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。1

2017-04-04 10:10:05 32343 2

原创 http的基本认识—(URL,消息结构,无状态)

什么是HTTP协议:  协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器  目前我们使用的是HTTP/1.1 版本。Web服务器,浏览器,代理服务器:  当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。

2017-04-04 09:31:55 2391

原创 宏和函数的区别

先说宏和函数的区别:1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的

2017-03-25 20:06:41 958

原创 sizeof关键字和strlen的比较

首先sizeof()是一个关键字(在编译期间就运算了),他不是一个函数。我们发现b的值没有变化。strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0"。sizeof(求内存大小)和strlen(求长度)的差异:1、整形数组:int a[] = { 1, 2, 3, 4 };printf( "%p\n",a)

2017-03-25 19:35:24 359

原创 shell中的命令替换

在shell中有(反单引号) ` 和 $()  两种命令替换:例如:那么我们就来讨论一下这两个的区别。在多层次的复合替换命令中,倒引号需要加”\”转义,$()则不需要。例如:

2017-03-24 23:05:58 345

原创 linux 命令之eval

linux的eval命令用于重新运算求出参数的内容。用法:eval command-line其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。例如:eval还可以取的最后一个参数:使用eval可以创建一个类似于“指针变量”的变量:

2017-03-24 22:52:51 222

原创 I/O多路复用之select

基本概念:IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:(1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。(2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。(3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。

2017-03-21 11:18:35 337

原创 TCP之报头格式——连接建立与拆除

在了解TCP的连接与拆除前,首先来看看什么是TCP:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol

2017-03-07 13:12:33 812

原创 TCP中的四种定时器

TCP一共使用四种计时器:重传计时器,坚持计时器,保活计时器,时间等待计时器。一.重传计时器:当TCP发送报文段时,就创建该报文段的重传

2017-03-06 11:03:09 547

原创 linux下设置定时任务(crond,crontab)

首先介绍一下crond:crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。Linux下的任务调度分为两类,系统任务调度和用户任务调度。系统任务调度

2017-02-28 13:16:30 450

原创 可重入函数与线程安全的区别

线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。我们定义四类线程不安全函数:第1类:不保护共享变量的函数将这类线程不安全函数变为线程安全的,相对比较容易:利用像P和V操作这样的同步操作来保护共享变量。这个方法的优点是

2017-02-24 10:55:36 739

原创 linux下如何使用gcc生成静态库和动态库

我们要想使用gcc来生成静态库和动态库,首先我们需要明白什么是静态库和动态库。本质上来说库是一种 可执行代码的二进制形式,可以被操作系统载入内存执行。linux中的库有两种:静态库和动态库(动态库又叫共享库)。两者最大的不同点在于两者代码被载入的时间不同。静态库:这类库的名字一般是"libxxx.a",利用静态库编译生成的文件比较大,因为在编译链接的时候静态库的

2017-02-18 20:46:30 550

原创 Makefile解析和简单的进度条实现

make和makefile简介:make:是一个非常重要的编译命令,本质上它是一个程序。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那样会变的很麻烦。而make工具则可自动完成编译

2017-01-03 14:05:20 1010

原创 Linux文件的特殊权限之Sticky Bit (粘滞位,SBIT)

在linux下文件除了r,w,x这三个重要权限以外,还有一些特殊权限,比如:SUID,SGID,SBIT.这些都是文件的特殊权限。今天我们就来重点讨论一下SBIT这个权限。Sticky Bit(SBIT):粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果

2016-12-31 10:25:22 1022

原创 linux下文件的查询(find,which,whereis,locate)

我们经常需要知道文件在哪里,才能对该文件进行一些修改或者其他的操作。有些软件的配置文件名字都一样,只是放的地方不同,我们需要找出他们的完整文件名,才能对他们进行操作。一,脚本文件名的查询:which(寻找“执行文件”)这个命令是根据PATH这个环境变量所规范的路径去查询“执行文件”的文件名。所以,他只是找出执行文件而已!which后面要接完整的文件名,如果加上-a,则可以列出所有的可以

2016-12-30 12:43:16 427

原创 Linux下文件的三个时间剖析及其修改

当我们在windows下创建一个文件打开他的属性我们就可以看得这个文件有三个时间,分别是创建时间,修改时间,访问时间。如下图所示:那么在Linux下的文件时间是什么样的,我们今天就来看一下。首先打开linux环境,创建一个文件,然后用 stat 命令。如下图:可以从上图看到系统为我们保存了这个文件的三个时间,分别是Access time、Modify time、Chan

2016-12-26 17:38:57 658

原创 判断一颗二叉树是否是完全二叉树

我们知道,假如一棵二叉树的高度是h,对于一棵完全二叉树,它的前h-1行一定是满的,第h行可以满也可以不满,但是结点必须集中于最后一行的左边,如果满则是满二叉树,不满的就是完全二叉树。那么那么我们该如何做呢? 如果一个结点有右孩子而没有左孩子,那么这棵树一定不是完全二叉树。 如果一个结点有左孩子,而没有右孩子,那么按照层序遍历的结果,这个结点之后的所有结点都是叶子结点这棵树才是完

2016-12-01 17:06:51 3525

原创 二叉树中最远两个节点的距离

计算一个二叉树的最大距离有两个情况:情况1: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况2: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距离。下面是实现代码:struct node { node *pLeft; node *pRi

2016-12-01 16:47:34 2965

原创 大数据面试题分析

最近看到一些大数据的面试题,今天就在这里好好分析一下。大数据面试题的条件一般都要求我们处理一批计算机内存放不下的数据。当我们遇到这种面试题时,我们会不知到该怎么办,其实我们可以通过以下这些思想来完成大数据处理: 1. 哈希切分 哈希切分就是将一个大文件,利用哈希的原理,将其分为若干个小文件。相同的数据都被分到同一个文件里。例如我有一个存放着100亿个整数的大文件,将其分为100个小文件。将

2016-11-10 15:12:21 1848

原创 二叉搜索树的实现

首先我们先来看看二叉搜索树的性质:1. 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。2. 左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3. 右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4. 左右子树都是二叉搜索树。首先来看看二叉搜索树的插入:1:首先判断树是否为空,为空就new新节点,放入

2016-10-23 15:03:30 399

空空如也

空空如也

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

TA关注的人

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