自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 问答 (2)
  • 收藏
  • 关注

转载 线段树介绍

文章目录1 线段树介绍1.1 线段树的结构及性质1.2 建树2 区间查询3 单点更新4 区间更新5 线段树的优缺点后记1 线段树介绍  线段树,我刚开始听到这个名字的时候,感觉就是高大上,怕难度会很大,但是实际学起来的时候,会发现还是挺好理解的,很亲民→_→  扯远了,先盗个图抛个问题:  图中的RMQ指的是(Range Minimum Query)问题(区间最值查询)。按暴力法直接一个for循环过去查询,每次查询的时间复杂度为O(N),频繁查询就是O(MN)了,性能上肯定要爆

2021-04-30 18:00:53 444 1

转载 求最大公约数(辗转相除法)

最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子,a, b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个 整数的最大公约数也有同样的记号。求最大公约数有多种 方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的 最小公倍数记为[a,b]。再来介绍一下辗转相除法:辗转相除法又叫欧几里得算法,是欧几里得最先提出来的.辗转相除法...

2021-04-30 16:30:49 737 1

转载 树的三种存储结构

树的三种存储结构一、双亲表示法用一组连续的空间存储树的结点。每个节点中,除了有数据域,还附加一个指示数,指向其双亲结点在链表中的位置/************************************************************************//* 树的双亲表示存储结构 *//********************************************...

2021-04-30 10:07:41 4450

转载 数据结构树的存储方式

数据结构树的存储方式_Richard_666的博客-CSDN博客

2021-04-30 10:06:24 162

转载 [搜索算法系列] —— 深度优先搜索

搜索本质上也是对解空间的枚举,本文介绍搜索算法中的深度优先搜索(图论)。全排列问题给定一个没有重复数字的序列,返回其所有可能的全排列。例如对于数列[1, 2, 3]其全排列为[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]。我们可以使用n层循环,每一层循环内确定一位数字,在最内层循环内判断该排列是否符合要求,例如对于数列nums = [1, 2, 3],可以写出如下代码。for i in nums:

2021-04-30 10:05:30 183

转载 [搜索算法系列] —— 广度优先搜索

此篇文章使用广搜解决全排列问题,我的上一篇文章详细介绍了使用深搜解决全排列问题的方法。全排列问题给定一个没有重复数字的序列,返回其所有可能的全排列。例如对于数列[1, 2, 3]其全排列为[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]。事实上,在网络上查找全排列问题解决方案,得到的绝大部分答案是使用深度优先搜索解决的,因为相较于广度优先搜索而言,深度优先搜索更容易被理解,下图即深度优先搜索的示意图。.

2021-04-30 10:04:44 315

转载 BFS(一):广度优先搜索的基本思想

广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略。 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的。首先生成第一层结点,同时检查目标结点是否在所生成的结点中,如果不在,则将所有的第一层结点逐一扩展,得到第二层结点,并检查第二层结点是否包含目标结点,……,对层次为n+1的任一结点进行扩展之前,必须先考虑层次完层次为n的结点的每种可能的状态。因此,对于同一层结点来说,求解问题的价值是相同的,可以按任意顺序来扩展它...

2021-04-30 10:00:17 1553

转载 回溯法(Backtracking)

回溯法回溯法概念回溯算法有“通用的解题法”之称。用它可以系统地搜索一个问题的所在解或任一解。回溯法是一个即带有系统性又带有跳跃性的所搜算法。回溯法思想在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索

2021-04-29 15:26:06 891

转载 深度优先搜索和广度优先搜索的比较与分析

深度优先搜索和广度优先搜索的深入讨论(一)深度优先搜索的特点是:(1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求。(2)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比.

2021-04-29 15:10:13 6114

转载 编程练习:走迷宫问题

问题:  实现给定迷宫,给出你认为最快的走出迷宫步数和策略;若不存在,请输出0。解决思路:  首先根据网上搜索资料,此问题可以看成是树的遍历问题,而典型的树的遍历可分为深度优先遍历和广度优先遍历,不同的遍历方式各有优缺点:摘录自:[一、深度优先搜索和广度优先搜索的深入讨论)]http://www.cnblogs.com/XBWer/archive/2012/06/20/2556558.html)(一)深度优先搜索的特点是:(1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同

2021-04-29 15:09:04 605

转载 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))

搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复习广度优先搜索(BFS)顾名思义,追求的是”覆盖面积”,现在来一张简单的有向图,广度搜索就是按照那个顺序搜索的,像有句话所说,道生一,一生二,二生万物!具体思想:从图中某顶点a出发,在访问了a之后依次访问a的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的

2021-04-27 14:18:12 1428

转载 c++11最简单的线程池实现

线程池是在处理高并发任务中有比较重要的价值,他的实现最基本原理就生产者和消费者模型,刚开始就开一定数量的线程,以程序中的某些功能模块为对象,以生产者与消费者模型为基本原理,不断使用这些固定数量的线程调度进行处理,避免了在高并发情况下,不断开辟线程造成的进程资源消耗.下面是一个简单的线程池程序,主要使用C++11中一些简单的新特性的最简单的线程池实现.ThreadPool.h#pragma once#include <iostream>#include<stdlib.h>

2021-04-27 13:22:25 381

转载 基于Linux/C++简单线程池的实现

我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等。C++11中的STL也提供了std:thread(然而我还没有看,这里先占个坑)还有很多第三方库的实现。这里我重复“造轮子”的目的还是为了深入理解C++和Linux线程基础概念,主要以学习的目的。首先,为什么要使用线程池。因为线程的创建、和清理都是需要耗费系统资源的。我们知道Linux中线程实际上是由轻量级进程实现的,相对于纯理

2021-04-27 13:07:40 184

转载 Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。一、写在前面1.1 线程池是什么线程池(Thread

2021-04-27 10:04:56 131

转载 不看后悔的项目中线程池实际应用

前言:最近在看线程池方面的内容,结合源码学习完其内部原理后,心想自己在项目中有实际使用过线程池吗?想了想,确实在项目中很多地方使用到了线程池;下面来简单聊下最近在日志方面中多线程的应用:服务接口日志异步线程池化入库处理定时任务中使用多线程进行日志清理本文主线:①、线程池基本原理解读;②、线程池实际应用例子:线程池应用 Demo 项目结构描述服务接口日志异步线程池化入库处理定时任务中使用多线程进行日志清理线程池基本原理解读:啥也不说,先贴一张脑图,通过脑图对线程池快速的进

2021-04-27 09:57:43 895 1

转载 linux C++ 多线程使用pthread_cond 条件变量

1. 背景多线程中经常需要使用到锁(pthread_mutex_t)来完成多个线程之间的互斥操作。但是互斥锁有一个明显到缺点: 只有两种状态,锁定和非锁定。而条件变量则通过允许线程阻塞并等待另一个线程发送唤醒信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。2. 条件变量涉及到的主要函数2.1 pthread_cond_wait 线程阻塞在条件变量 int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut...

2021-04-26 18:09:06 663

转载 Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量、信号量和读写锁。下面是思维导图:简介进程— 资源分配的最小单位线程— 程序执行的最小单位进程是一个程序的一个实例,拥有自己独立的各种段(数据段,代码段等等),每次创建一个进程需要从操作系统分配这些资源给他,消耗一定的时间,在linu.

2021-04-26 17:23:43 457

转载 Linux条件变量pthread_condition细节(为何先加锁,pthread_cond_wait为何先解锁,返回时又加锁)

一览本文目的为何需要条件变量三个问题传入前锁mutex传入后解锁mutex返回前再次锁mutexpthread_cond_signal的两种写法尾语本文目的  首先说明,本文重点不在怎么用条件变量。这里我先列出 apue 中对于pthread_cond_wait函数的这么一段话:“ 调用者把锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件的线程列表上,**对互斥量解锁。**这就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任.

2021-04-26 15:19:24 662

转载 Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

转载请注明出处: http://kyang.cc/栈是什么?栈有什么作用?首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据栈的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文要讨论的并不是软件层面的栈,而是硬件层面的栈。大多数的处理器架构,都有实现硬件栈。有专门的栈指针寄存器,以及特定的硬件指令

2021-04-26 10:06:26 139

转载 Linux进程栈和线程栈

参考资料:http://blog.csdn.net/xhhjin/article/details/7579145总结: 1、进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时候决定的,也不是在链接的时候决定的 2、进程的栈大小是随机确定的至少比线程栈要大,但是不到线程栈大小的2倍 3、线程栈大小是固定的,也就是ulimit -a 显示的值查看线程栈大小:可以看到默认情况下线程栈大小为8192(8MB),可以使用ulimit -s xxx修改线程...

2021-04-26 09:40:19 101

转载 十大经典排序算法的复杂度分析

十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。各排序算法复杂度及稳定性:相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:..

2021-04-22 18:03:52 1189

原创 技术网站记录分享

记录有价值的网站,持续更新http://www.52im.net/,即时通讯,通讯相关开发者社区。

2021-04-21 15:15:25 91

转载 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

1、引言好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不能理解Web短连接(就是最常见的HTTP通信了)跟长连接(主要指TCP、UDP协议实现的socket通信,当然HTML5里的Websocket协议也是长连接)的区别,导致写即时通讯这类系统代码时往往找不到最佳实践,搞的一脸蒙逼。本篇我们先简单了解一下 TCP/IP,然后通过实现一个 echo 服务器来学习 Java 的 Socket API。最后我们聊聊偏高级一点点的 socket 长连接和协议设计。另外,本系列文章的前2篇《网络编

2021-04-21 15:09:37 639

转载 ::connect失败的原因_从Linux源码看Socket(TCP)Client端的Connect

从Linux源码看Socket(TCP)Client端的Connect前言笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。今天笔者就来从Linux源码的角度看下Client端的Socket在进行Connect的时候到底做了哪些事情。由于篇幅原因,关于Server端的Accept源码讲解留给下一篇博客。(基于Linux 3.10内核)一个最简单的Connect例子int clientSocket;if((clientSocket = socket(AF

2021-04-21 14:48:20 3398

转载 linux下connect超时时间探究

最近在linux做服务器开发的时候,发现了一个现象:服务器在启动的时候调用了 connect 函数,因为连接了一个不可用的端口,导致connect最后报出了 “Connection timed out” 的错误。但是这中间过了六十多秒的时间。为何会等待这么长的时间才超时呢?这个时间又在哪里设置?《UNIX网络编程(第一卷)——套接口 API 和 X/Open 传输接口 API》一书的4.3节有写到:  对于TCP套接口来说,函数 connect 激发TCP的三路握手过程,且仅在链接成功建立或出错

2021-04-21 14:00:28 1427

转载 设置socket connect超时时间的几种方法

BSD int connectTimeout = 30; setsockopt(sock, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT,(char *)&connectTimeout, sizeof(connectTimeout));12Linuxsocket选项TCP_SYNCNT可以控制TCP连接SYN重传次数,默认为0,为0时SYN重传次数由系统参数 net.ipv4.tcp_syn_retries 控制,该系统参数默认值为6。SYN重传次...

2021-04-21 10:56:59 11062 1

转载 设置linux中tcp默认的20秒connect超时时间(转)

阅读目录无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect、read、write的超时时间。你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊。connect的超时时间在任意的内核实现上都有一个可以设置的最大值,你的代码中设置的超时值并不能超过这个最大值(即使你设置的值超过这个最大值,其仍然会在最大超时时间后time out)。tcp建立连接的过程从客户端发送syn包开始。如果客户端没有收到这个syn包的回复,内核会重试多次..

2021-04-21 10:48:26 5227 2

转载 技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)

1、前言作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UDP协议),但对于IP协议,对于应用程序员来说更多的印象还是IP地址这个东西,再往深一点也就很难说的清楚。本文将简要回故TCP/IP协议的过去、简单介绍TCP/IP协议族的关系,并与大家一起直观地分享由TCP/IP协议族所构建的虚拟网络与真实世界的“连接”情况。2、TCP/IP协议简介互联网协议族(英语:Internet Protocol Suite,缩写为IPS),是一个网络通信模型,以及一整

2021-04-21 10:34:33 2115

转载 https://blog.csdn.net/dinghuiyang/article/details/83149487?utm_medium=distribute.pc_relevant.none-ta

首先socket在默认情况下是阻塞状态的,这就使得发送以及接收操作处于阻塞的状态,即调用不会立即返回,而是进入睡眠等待操作完成。下面把讨论点分为发送以及接收。一.发送选用send(这里特指TCP)以及sendto(这里特指UDP)来描述 首先需要说明的是,不管阻塞还是非阻塞,在发送时都会将数据从应用缓冲区拷贝到内核缓冲区(SO_RCVBUF选项声明,除非缓冲区大小为0)。我在网络上看到某些人说,阻塞就是将数据真正发送给对方,并且阻塞是发生在需要把前面的所有数据全部发送出去,然后再发送本次的...

2021-04-20 22:22:31 254

转载 printf(“%02x\n“, c) 之坑------浪费0.5小时

实际上, 在不久前, 我聊过这个, 为了再次强调(因为踩了坑, 浪费0.5小时), 故再次来玩一遍:#include <iostream>using namespace std; int main(){ char c1 = -1; printf("%02x\n", c1); // ffffffff char c2 = 250; printf("%02x\n", c2); // fffffffa printf("heheda\n"); unsigned ch.

2021-04-20 17:02:23 308

转载 基于C++11的线程池(threadpool),简洁且可以带任意多的参数

工作这些年,写过很多线程池,有基于IOCP的,也有基于BOOST的ASIO的,也有基于_beginthreadex完全裸写的,还有其它版本。虽然造过很多轮子,但基本上因为工期,业务等各种原因,没有实现过完全解耦的线程池,自己感觉非常遗憾,前一段时间工作终于忙完了,可以短暂休息几周,因为老大们决定放弃一些平台了,所以,这次技术上,可以一次性升级到位,使用C++ 11 ,15,17了, 真TMD和谐。下面转载一篇关于C++ 11版本线程池的文章,个人觉得非常不错,原文链接:点击打开链接..

2021-04-16 14:56:17 646

转载 戏(细)说Executor框架线程池任务执行全过程(上)

http://www.infoq.com/cn/articles/executor-framework-thread-pool-task-execution-part-01一、前言1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦。要执行任务的人只需把Task描述清楚,然后提交即可。这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不用关心了。具体点讲,提交一个Callable对象给ExecutorService(如最常用的线程池ThreadPoolExecutor)

2021-04-16 14:30:57 179

空空如也

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

TA关注的人

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