自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 图的深度优先搜索

图的深度优先搜索与广度优先搜索相对应,其思想是先在一条路径上走到终点,然后再回过头走其他路径。如果图中有n个节点,e条边,那么用邻接表存储的图的时间复杂度为O(n+e),用邻接矩阵存储的图的遍历时间复杂度为O(n^2)。 这里实现了用邻接表存储的图的深度优先搜索:void DFS() { size_t size = _v.size(); if(size...

2018-04-26 16:34:43 245

原创 图的广度优先搜索

图的搜索方法有广度优先与深度优先搜索方法。这里给出广度优先搜索。 广度优先搜索即先遍历完同一层次的元素,然后再遍历下一层次的元素。用邻接表存储的图的广度优先遍历时间复杂度为O(e),使用邻接矩阵存储的图的广度优先方法时间复杂度为O(n^2)。 给出广度优先搜索代码:void BFS() { size_t size = _v.size(); if(...

2018-04-26 16:21:38 361

原创 图的存储结构

这里实现图的两种存储结构——邻接矩阵与邻接表。 邻接矩阵 用邻接矩阵存储图需要用到两个数组——一个存储元素的一维数组和一个存储图关系的二维数组。其实现代码:template<typename V, bool IsDigraph = true>class Map{public: Map(const string str = "") { s...

2018-04-26 15:21:45 182

原创 死锁的产生及其解决方法

死锁的书面定义:一组相互竞争系统资源或进行通信的进程间的“永久”阻塞。 死锁原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他被阻塞进程才能触发该事件,这时就称这组进程发生了死锁。 一种死锁情况: 死锁的必要条件: 1、互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。 2、占有且等待:当一个进程等待其他进程时,继续占有已经分配的资...

2018-04-24 23:10:19 1975

原创 排序算法之基数排序_LSD

基数排序是非比较排序的一种,LSD是基数排序的一种,又称为最低位优先,其基本思想是先按最低位关键码的大小将元素放入一个桶中,然后取出再按次低位的大小执行前面操作,直到最高位为止。LSD的时间复杂度为O(MN)(M为最大的数的位数),空间复杂度为O(N)。 实现:#include <vector>int Pow(const int& left, const int&...

2018-04-21 10:46:38 1778

原创 排序算法之计数排序

计数排序的思想特别简单,就是记录下序列中每个元素出现的次数,然后根据保存次数的下标及出现次数将元素放回原数组。时间复杂度为O(N+数据范围),空间复杂度为O(最大数-最小数)。 代码实现:#pragma onceint FindMax(int *array, const int size){ assert(NULL != array && size >...

2018-04-19 16:59:07 216

原创 进程间关系

一、进程组:一个或多个进程的集合。通常,它们与一作业相关联,可以接收来自同一终端的信号。每个进程组有唯一的进程组ID。每个进程有一个组长进程,其进程ID就是进程组ID。 组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要进程组中有一个进程存在,进程组就一直存在,与其组长是否存在无关。 用代码创建一个进程组:#include <stdio.h>#include &...

2018-04-15 23:21:23 2775

原创 进程信号的捕捉

信号递达时有三种方式: 1、忽略。 2、按默认方式处理。 3、自定义处理。 如果信号的处理是自定义的,当信号递达时就调用某个用户自定义函数,这就是信号的捕捉。 当然,必须要用系统调用通过内核来实现信号捕捉。信号捕捉的整个过程: 要捕捉某个信号,首先要注册这个信号的处理函数,在以前通常会用signal函数,其函数原型为:void (*signal(int signo, void ...

2018-04-14 17:10:43 1348 1

原创 进程信号的阻塞

先给出几个与信号有关的概念: 1、实际执行信号的处理动作称为信号递达(Delivery)。 2、信号从产生到递达之间的状态,称为信号未决(Pending)。 3、进程可以选择阻塞 (Block )某个信号。 4、被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏行递达的动作。 PS:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的⼀种处理动作。 ...

2018-04-13 20:33:40 1166

原创 读写锁与读写者模型

在多线程编程中,有时候修改公共数据的情况比较少,而读取数据的情况比较多,这就是读写者模型了。读写者模型中的“321”: 三种关系——写者与写者之间为互斥关系,写者与读者为互斥同步关系,读者与读者之间无关系。 两种角色——读者与写者。 一个公共场所。 用读写锁可以很好的解决读写者问题。读写锁是一种自旋锁,其行为有: 读写锁接口: 初始化与销毁:#include <pthre...

2018-04-13 17:50:08 336

原创 排序算法之归并排序

归并排序即用两两归并的方式进行排序,其基本思想是将数组两两划分,当划分到区域中只有一个元素时返回上一级进行两个区域的归并,这样反复归并就可得到一个有序序列。归并排序的时间复杂度为O(nlgn),空间复杂度为O(n)。 代码实现:#include "compare.hpp"template <typename T>static void _conflation(T *arra...

2018-04-12 22:28:47 171

原创 POSIX信号量实现生产者消费者模型

POSIX信号量与System V信号量作用相同,都用于同步操作,达到无冲突的访问共享资源的目的,但POSIX信号量可用于线程间同步。 初始化信号量:#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);参数:pshared:0表⽰示线程间共享,⾮非零表⽰示进程间共...

2018-04-12 21:35:42 1406

原创 生产者消费者模型

在生产者消费者模型中,生产者之间为互斥关系,消费者之间也是互斥关系,而生产者与消费者既有互斥关系又有同步关系。在这里用互斥量与条件变量来实现生产者消费者模型:#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <stdlib.h>#include &lt...

2018-04-10 17:52:36 123

原创 Linux多线程互斥与同步

有些变量被多个线程共享,这样的变量被称为共享变量,在程序中,可以通过共享变量来完成线程间的交互。但是多个线程在用共享变量进行交互时,常常会出现某些问题。来看下面代码:#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <stdlib.h>#inclu...

2018-04-10 16:26:33 355

原创 排序算法之选择排序2—快排

快速排序也叫分区排序,其基本思想是在特定范围内对于某个基准值,将小于这个基准值的元素全部移到这个值的前面,大于这个值的元素全部移到这个值的后面,然后再对前后范围的元素递归进行分区,最终得到一个有序序列。快速排序的时间复杂度为O(nlgn),空间复杂度为O(lgn),当数组元素数量较大时,快速排序要比其他排序都要好,但是当数量级较小时,快速排序的性能可能没有其他排序好。 下面给出快排的实现:...

2018-04-09 21:09:37 162

原创 Linux多线程之创建、终止、等待和分离

线程创建函数:#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);参数thread:返回线程ID。attr:设置线程的属性,attr为NULL表⽰示使⽤用默认属性。star...

2018-04-09 20:44:56 414

原创 Linux下的多线程概念

线程是进程内部的执行单位,一个线程即使进程内的一个执行流。对于线程,每个系统的实现可能不一样,在Linux中,线程也叫轻量级进程,操作系统没有把线程与进程明显的区分开,它们的数据结构是一样的,都是task_struct。在进程资源分配时,以进程为单位进程分配;而在调度时,则以线程为单位。可以这样理解,代码最初被加载进内存中时,系统会给这些代码分配一系列资源,这样就创建了一个“进程”,而进程内部可能...

2018-04-07 15:44:05 335

原创 进程信号的产生

信号是信息的载体,发送某种信号即是发送传递某种信息。这里的进程信号是指软件中断,它提供了一种处理异步事件的方法。 在Linux中,我们可以用kill -l 命令查看有多少信号: 可以看到有62种信号,其中1~31号信号是普通信号,34~64属于实时信号,这里仅讨论普通信号。 不同的信号有不同的产生方式,可分为这么几类: 1、用户在终端按下某些按键时,终端驱动程序会发送信号给前台进程,...

2018-04-05 23:49:46 703

空空如也

空空如也

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

TA关注的人

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