大傻与小火机写字的地方


  • 首页

  • 分类

  • 归档

  • 关于

  • 标签

奇怪的汉诺塔

发表于 2019-04-21 | 分类于 算法竞赛进阶指南 |

问题

汉诺塔问题,条件如下:
1、这里有A、B、C和D四座塔。
2、这里有n个圆盘,n的数量是恒定的。
3、每个圆盘的尺寸都不相同。
4、所有的圆盘在开始时都堆叠在塔A上,且圆盘尺寸从塔顶到塔底逐渐增大。
5、我们需要将所有的圆盘都从塔A转移到塔D上。
6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。
请你求出将所有圆盘从塔A移动到塔D,所需的最小移动次数是多少。
阅读全文 »

费解的开关

发表于 2019-04-16 | 分类于 算法竞赛进阶指南 |

问题

你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

阅读全文 »

muduo库限制服务器最大并发连接数的方法

发表于 2018-05-24 | 分类于 muduo网络库 |

为什么要限制并发连接数

不希望服务器超载,file descriptor是稀缺资源,如果出现file descriptor不足,问题很严重。

如果不限制并发连接数可能会引发的问题

对于reactor模式,listening socket是一种特殊的IO对象。当有新连接到来时,此socket变为可读,epoll_wait会返回这一事件,然后在事件处理器中调用accept获得新连接的socket,但是如果本机的file descriptor已经用尽,则accept会返回EMFILE,标志accept调用失败,新连接依旧在listen的连接池中没有取出来。既然没有socket文件描述符来表示这个连接,所以也不能close它。程序继续执行,调用epoll_wait。但是epoll_wait会立刻返回,因为前面的新连接还在连接池中等待处理,listening fd还是可读的,这样程序就陷入了busy loop中。CPU占用率会达到100%,影响了服务器的性能。

阅读全文 »

面向对象编程风格与基于对象编程风格(boost::bind/function)

发表于 2018-05-23 | 分类于 muduo网络库 |

面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。没有了继承的概念也就无从谈论“多态”。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。

阅读全文 »

pthread_atfork函数解决多线程多进程死锁问题

发表于 2018-05-20 | 分类于 Linux网络编程 |

最好不要同时使用多线程多进程,两者择其一。比如在多线程程序中调用fork容易出现死锁。下面取一个例子说明这种情况,先看死锁代码。

阅读全文 »

posix条件变量与互斥锁 示例生产者消费者问题

发表于 2018-05-18 | 分类于 Linux网络编程 |

posix条件变量

一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行,现在这个条件不成立,线程A就阻塞等待,而线程B在执行过程中使这个条件成立了,就唤醒线程A继续执行。

pthread_cond_wait(&pcond_, mutex_.getPthreadMutex());

一个Condition Variable总是和一个Mutex搭配使用的。一个线程可以调用pthread_cond_wait在一个Condition Variable上阻塞等待,这个函数做以下三步操作:

1. 解锁;如果没有解锁,`其他线程,没法进入临界区`,修改条件,条件将始终没法成立。
2. 等待通知;
3. 得到通知返回前重新加锁; 重新加锁,是`下面的解锁操作对应起来`
阅读全文 »

posix匿名信号量与互斥锁 示例生产者消费者问题

发表于 2018-05-18 | 分类于 Linux网络编程 |

posix 信号量

system v信号量只能用于进程间同步,而posix信号量除了可以进程间同步,还可以线程间同步。system v信号量每次PV操作可以是N,但posix信号量每次PV只能是1。除此之外,posix信号量还有命名和匿名之分。

命名信号量

名字以/somename形式分辨,只能有一个/ ,且总长不能超过NAME_MAX - 4(一般是251)。
需要用sem_open函数创建或打开,PV操作分别是sem_wait和sem_post,可以使用sem_close 关闭,删除用sem_unlink。命名信号量用于不共享内存的进程间同步,类似system v信号量。

阅读全文 »

实现strStr()

发表于 2018-05-16 | 分类于 面试算法 |

问题

Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Example 1:

Input: haystack = "hello", needle = "ll"
Output: 2
Example 2:

Input: haystack = "aaaaa", needle = "bba"
Output: -1
阅读全文 »

muduo库TcpConnection成员函数handleRead send shutdown handleWrite

发表于 2018-05-16 | 分类于 muduo网络库 |

handleRead函数

修改TcpConnection::handleRead()代码。现在当某个TcpConnection发生可读事件,调用TcpConnection::handleRead(),先调用inputBuffer.readFd()将内核接收缓冲区数据读取到inputBuffer中,接着调用messageCallback_,用户代码可以按消息界限从inputBuffer_ 中读取数据。

阅读全文 »

两数相加和II(已排序数组)

发表于 2018-05-15 | 分类于 面试算法 |

问题

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution and you may not use the same element twice.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
阅读全文 »
1234…11
Shaojie Li

Shaojie Li

学习总结 思考感悟 知识管理

107 日志
15 分类
15 标签
RSS
© 2017 — 2019 Shaojie Li
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4