摘要: 算法描述:许多应用程序都需要按照顺序处理任务,但是不一定要求他们全部有序,或是不一定要一次就将他们排序。很多情况下我们只需要处理当前最紧急或拥有最高优先级的任务就可以了。面对这样的需求,优先队列算法是一个不错的选择。 算法图示: 算法解释:上图所展示的是最大优先队列(大顶堆)的算法逻辑,在这个标准的 阅读全文
posted @ 2018-08-25 22:15 冷豪 阅读(762) 评论(0) 推荐(0) 编辑
摘要: 算法描述:快速排序是一种分治的排序算法。它将数组分为两个子数组,并将两部分独立的排列。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。 算法图示: 算法解释:选择标的元素(5) 阅读全文
posted @ 2018-08-18 13:26 冷豪 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 算法描述:将两个较小的有序数组合并成为一个较大的有序数组是比较容易的事情。我们只需要按照相同的顺序依次比较最左侧的元素,然后交替的放进新数组即可。这就是自顶向下的归并排序的实现思路。与之前的算法不同的是,归并排序需要使用额外的存储空间,用空间换时间的做法也是在排序算法中经常需要做的选择。 算法图示: 阅读全文
posted @ 2018-08-18 11:35 冷豪 阅读(2420) 评论(0) 推荐(0) 编辑
摘要: 算法描述:希尔排序是一种基于插入排序的快速排序算法,相比于传统的相邻插入,希尔排序更加适合大规模乱序数组的排序。和插入算法一样,我们也可以优化插入和移动的过程从而进一步提升算法效率。 算法图示: 希尔排序算法的实质是首先将一个大的乱序数组变成几个小的有序数组,再逐步调整数组长度。最后一步依然是做一次 阅读全文
posted @ 2018-08-18 11:10 冷豪 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 算法描述:通常人们在整理扑克的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在算法的实现中,为了给要插入的元素腾出1个空间,我们需要将其余所有元素在插入之前都向右移动1位。这种算法叫插入算法。 算法图示: 算法解释:在基础版本中通常的做法是,当新元素需要被插入有序数组的时候,从右 阅读全文
posted @ 2018-08-12 00:08 冷豪 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 算法描述:一种最简单的排序算法是这样的:首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置。再次,再剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,知道将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。 算法图示: Java代码示例 阅读全文
posted @ 2018-08-11 23:25 冷豪 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 适用场景:当需要在大量有序数据中查找的时候,推荐使用二分查找法(BinarySearch)。 下图演示的是在有序数组[10,11,12,16,18,23,29,33,48,54,57,68,77,84,98]中命中23和未命中50的情况: Java代码示例: Qt/C++代码示例: 相关附件: wh 阅读全文
posted @ 2018-08-10 22:31 冷豪 阅读(555) 评论(0) 推荐(0) 编辑
摘要: 最近一直在忙项目,不知不觉2个多月没有更新博客了。正好自学了几天docker就干脆总结一下,也顺带增加一篇《30分钟入门系列》。网上能够查到的对于docker的定义我就不再重复了,说说我自己对它的理解:Docker一个方便多次部署的虚拟化Linux容器,与当下流行的SpringBoot和微服务框架搭 阅读全文
posted @ 2018-08-04 23:55 冷豪 阅读(1779) 评论(2) 推荐(1) 编辑
摘要: 上一章我用一个demo函数演示了基于Qt的音视频采集到编码的完整流程,最后经过测试我们也发现了代码中存在的问题。本章我们就先处理几个遗留问题,再对代码进行完善,最后把编码功能做基础封装。 一、遗留问题和解决方法 (1)如何让音视频的录制保持同步? 在我们的演示代码中之所以发现音视频录制不同步的主要原 阅读全文
posted @ 2018-05-20 01:31 冷豪 阅读(3563) 评论(1) 推荐(0) 编辑
摘要: 前两讲演示了基本的解码流程和简单功能封装,今天我们开始学习编码。编码就是封装音视频流的过程,在整个编码教程中,我会首先在一个函数中演示完成的编码流程,再解释其中存在的问题。下一讲我们会将编码功能进行封装并解释针对不同的输出环境代码上需要注意的地方。最后我们还会把之前做好的解码器添加进开发环境,实现P 阅读全文
posted @ 2018-05-06 00:26 冷豪 阅读(6783) 评论(4) 推荐(4) 编辑
摘要: 与解码相关的主要代码在上一篇博客中已经做了介绍,本篇我们会先讨论一下如何控制解码速度再提供一个我个人的封装思路。最后回归到界面设计环节重点看一下如何保证播放器界面在缩放和拖动的过程中保证视频画面的宽高比例。 一、解码速度 播放器播放媒体文件的时候播放进度需要我们自己控制。基本的控制方法有两种: 媒体 阅读全文
posted @ 2018-04-29 13:34 冷豪 阅读(3496) 评论(9) 推荐(2) 编辑
摘要: 前言:对于从未接触过音视频编解码的同学来说,使用FFmpeg的学习曲线恐怕略显陡峭。本人由于工作需要,正好需要在项目中使用。因此特地将开发过程总结下来。只当提供给有兴趣的同学参考和学习。 由于FFmpeg是使用C语言开发,所有和函数调用都是面向过程的。以我目前的学习经验来说,通常我会把一个功能的代码 阅读全文
posted @ 2018-04-29 00:59 冷豪 阅读(12119) 评论(3) 推荐(3) 编辑
摘要: 花了一周时间开发了一个简单的即时通信工具,勉强算是程序原型。现在我把开发流程和一些个人的想法记录下来。本文首先介绍程序架构和通信接口,之后会聚焦到服务器的信号槽设计原则,接下来将解释有关TCP通信的粘包问题和解决方案,最后一个部分是一些改进建议。 源码下载:https://gitee.com/lea 阅读全文
posted @ 2018-03-24 23:13 冷豪 阅读(803) 评论(0) 推荐(0) 编辑
摘要: 在针对大数据量的多表级联查询或复杂事务处理的时候,引入Oracle临时表是一种不错的策略。因此,在解决实际需求时经常会遇到需要使用存储过程和临时表相互配合的情况。下面就Oracle如何创建临时表以及注意事项做出总结: 一、创建临时表 Oracle临时表分为回话期和事务期两种类型,他们的创建语法基本一 阅读全文
posted @ 2018-03-11 17:26 冷豪 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C++中如何选择传参方式。 先来看第一段程序: 通过main函数的调用,我们发现x,y并未实现交换: 原因是整形x和y在函数swap内为按值传递,按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝,这些拷贝被存储在运行栈 阅读全文
posted @ 2018-03-11 12:32 冷豪 阅读(61646) 评论(0) 推荐(7) 编辑
摘要: 第一讲先从一个实例开始——我们需要完成一个遍历文件并统计单词出现次数的任务。分解功能:首先,按行读取文件并舍弃可能的空行。其次,将每一行都按照空格划分单词。因为可能存在标点符号,我们还需要将标点符号都删除。最后把行首或专有名词中出现的大写字母统一转换。最后将所有获取的字母放到一个关联容器中(map< 阅读全文
posted @ 2018-03-10 20:24 冷豪 阅读(1142) 评论(0) 推荐(0) 编辑
摘要: 1 并发 多用户数据库管理系统的一个主要任务是对 并发(concurrency)进行控制,即对多个用户同时访问同一数据进行控制。当缺乏有效的并发控制时,修改数据的操作就不能保证正常,从而危害数据完整性。管理数据并发的方法是让每个用户轮流操作数据。而数据库管理系统的目标就是减少每个用户的等待时间,即让 阅读全文
posted @ 2018-02-19 13:24 冷豪 阅读(909) 评论(0) 推荐(0) 编辑
摘要: 最近在学习RabbitMQ,在网上找了不少资料发现都特高端。动辄集群部署,分布式架构什么的,对于一个初学者实在不够友好。心想求人不如求自己,为什么不自己整理一套资料呢?于是《30分钟学玩转RabbitMQ》诞生。 一、准备工作 据说RabbitMQ是可以部署到Windows环境的,不过作为一个专业级 阅读全文
posted @ 2018-01-27 00:34 冷豪 阅读(4407) 评论(3) 推荐(6) 编辑
摘要: 长话短说就直接说说未来一年的个人计划吧 一、做一个基于微服务和消息队列的高可用数据同步装置,大致需求如下 满足不同关系型数据库之间的数据传递 满足m:n(多对多)端的发送和接收 通信接口使用RESTful架构 适应高并发和分布式的使用场景 倒没什么特别的目的,就是觉得应该写点什么作为对目前个人能力的 阅读全文
posted @ 2017-12-31 23:02 冷豪 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 前一篇博客,我总结了Tomcat对于生命周期组件的管理。在了解了容器的启动之后,我们开始剖析它的内部运行机制。今天我们来分析一下Tomcat如何处理Request。Socket作为网络通信的基础也是Request和Response的底层实现,有过Socket使用经验的读者一定不会对下面的伪代码陌生: 阅读全文
posted @ 2017-12-30 11:47 冷豪 阅读(2651) 评论(0) 推荐(0) 编辑
摘要: 一周以来有关“欧建新”的话题在网络上不断发酵,愈演愈烈。有的人说是不惑之年的彷徨,也有人认为是国内IT从业人员的悲凉。今日又有传言南京途牛旅游突然裁员,遭到裁员的人员主要是各部门的开发人员。看来,真正的严冬才刚刚开始。如何度过一个又一个寒冬并生存下来,我们聊聊。 一、未来五年的机会在哪里 中国的“速 阅读全文
posted @ 2017-12-23 00:34 冷豪 阅读(1216) 评论(5) 推荐(3) 编辑
摘要: 写在前面的话:读Tomcat源码也有段时间了,大领悟谈不上。一些小心得记录下来,供大家参考相护学习。 一、启动流程 Tomcat启动首先需要熟悉的是它的启动流程。和初学者第一天开始写Hello World一样,Tomcat的启动也依赖main方法。 实例化Bootstrap之后,首先需要对它初始化。 阅读全文
posted @ 2017-12-16 22:11 冷豪 阅读(1209) 评论(0) 推荐(0) 编辑
摘要: 最近加入了一个临时的项目组,针对前期客户提出的需求在原有系统上做一些升级开发。说白了就是只能使用旧的技术在原有代码上增加功能,有的是需要开发新功能有的只是在原有基础上进行改进。刚开始,项目经理在和我谈需求的时候聊得轻描淡写,以为只是做一些简单的迭代开发,因此信心满满的答应下来。可直到拿到项目的源码才 阅读全文
posted @ 2017-11-05 11:27 冷豪 阅读(812) 评论(3) 推荐(1) 编辑
摘要: 在本系列的上一篇文章中,我们讨论了JDK对于观察者模式的一套实现。今天我们将要从另一个角度来探索Tomcat中是如何利用观察者模式加载各个组件。不过今天的任务不是解释Tomcat,所以我会单独把重点抽象出来展现如何在一个实际利用中使用Observer。 先谈一下我对观察者模式的理解。对于对象而言,观 阅读全文
posted @ 2017-10-22 10:16 冷豪 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 今天不聊代码也不谈架构,今天我只想说说对每个人来说都必不可少又并非最重要的工作环节之一——面试。 几乎各大培训结构在他们的学员即将毕业的时候都会开一两节有关面试的课程,无非是教大家如何因对考官的问题或者如何在一些冷门知识上回答让对方满意。似乎最后给大家的观念就是——只要你能对考官的问题做到基本对答如 阅读全文
posted @ 2017-08-27 12:27 冷豪 阅读(2936) 评论(4) 推荐(11) 编辑
摘要: 今天打算用C++模拟一下Java的Object对象。需求很简单,通过一个自定义用户类型包装一个内建类型,并提供equals、hashCode、=和== 4种函数。 源码如下: C++11 提供了Hash方法正好拿来使用,可是在测试==的时候却发现编译器报错:“size_t Entity<int>:: 阅读全文
posted @ 2017-08-12 12:52 冷豪 阅读(2501) 评论(0) 推荐(0) 编辑
摘要: 起因:前天去一家公司面试被问到数据加密的相关知识,完全回答不上来,回家后特地总结了一下。 一、编码、散列与加解密 编码:使用约定的协议对数据格式化。编码的反向操作是解码,双方并不需要专用密钥来获取真实数据。 散列:使用特定算法获取对象的数字摘要。散列是一种特殊算法,他人几乎无法伪造与原始数据完全相同 阅读全文
posted @ 2017-07-23 20:49 冷豪 阅读(1462) 评论(0) 推荐(1) 编辑
摘要: “双缓存队列”是我在一次开发任务中针对特殊场景设计出来的结构。使用场景为:发送端持续向接收端发送数据包——并且不理会接收端是否完成业务逻辑。由于接收端在任何情况下停止响应即可能产生数据丢失,因此无法简单的设计一条线程安全队列来对数据写入或读取(读取数据时将队列上锁视为对写入的停止响应)。 鉴于此,我 阅读全文
posted @ 2017-07-22 12:57 冷豪 阅读(2222) 评论(0) 推荐(0) 编辑
摘要: 时隔一年终于又推出了一篇30分钟系列,上一篇《30分钟学会反向Ajax》是2016年7月的事情了。时光荏苒,岁月穿梭。虽然一直还在从事Java方面的开发工作,但是私下其实更喜欢使用C++。不过今天,我们要再次回归到Java的主题,来谈一谈如何使用——Spring Web Services框架。 Sp 阅读全文
posted @ 2017-07-19 14:13 冷豪 阅读(20305) 评论(2) 推荐(3) 编辑
摘要: 查找树ADT——查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。 现在给出字段和方法定义(BinarySearchTree.h) 查找二叉树的遍历可以采用遍历和非遍历两种算法。 一、添加元素(insert) 现在假设要添加这样一组整 阅读全文
posted @ 2017-06-23 22:24 冷豪 阅读(2366) 评论(0) 推荐(1) 编辑
摘要: 世界上一成不变的东西,只有“任何事物都是在不断变化的”这条真理。 —— 斯里兰卡 开端: 周一接到项目经理的邮件,让我去了解一下JHipster——这是我第一次听到这个名字,甚至连Angularjs和Spring data JPA 都没有正规接触过。邮件附带了一个Github上的地址,是客户的项目源 阅读全文
posted @ 2017-05-13 12:18 冷豪 阅读(536) 评论(3) 推荐(2) 编辑
摘要: 今天要介绍一个这样的数据结构: ——跳跃表 Skip List 一、普通链表 对于普通链接来说,越靠前的节点检索的时间花费越低,反之则越高。而且,即使我们引入复杂算法,其检索的时间花费依然为O(n)。为了解决长链表结构的检索问题,一位名叫William Pugh的人于1990年提出了跳跃表结构。基本 阅读全文
posted @ 2017-04-22 21:43 冷豪 阅读(9857) 评论(0) 推荐(6) 编辑
摘要: 算法概述:要求实现将一条单向链表反转并考虑时间复杂度。 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销。 移动指针: 通过三个指针逐个从链表头开始逐一反转链表元素的指针 点评:不需要额外的内存开销,会改变原始链表。 递归: 以递归的 阅读全文
posted @ 2017-04-16 16:37 冷豪 阅读(1436) 评论(0) 推荐(0) 编辑
摘要: 两天时间写的小品,以前的J2EE环境基本使用框架。现在使用JDBC配合Oracle存储过程模拟了一下用户注册和用户认证。 一、添加必须的jar包 需要JDBC连接Oracle的包和shiro-core依赖,添加shiro-core主要为了方便使用SHA-256散列算法。 二、编写JDBC连接 三、建 阅读全文
posted @ 2017-01-05 11:05 冷豪 阅读(1317) 评论(0) 推荐(0) 编辑
摘要: JDK中的Map类型采用键值对的方式保存数据,且键(key)不能重复。在HashMap的实现中实际采用了Hash分类加数组排序的方式。在C++中我没有采用这样的算法。而是通过首先对Key值进行二叉树排序,再查找对应的Value。而对整个树型结构排序则使用最基本的中序遍历。这些都是数据结构的知识,不太 阅读全文
posted @ 2016-12-06 15:57 冷豪 阅读(499) 评论(0) 推荐(0) 编辑
摘要: 之所以要把它们放在一起,是因为在使用C/C++类语言的时候,很容易混淆这几个概念(对Java来说完全没有这样的问题,表示Javaor完全没有压力)。 先建立一个测试类(包含.h和.cpp) 通常重载赋值运算符容易遗忘,但是它真的很重要。所以推荐,如果你记得重载拷贝构造就一定要对赋值运算符做对应处理。 阅读全文
posted @ 2016-12-02 10:29 冷豪 阅读(3345) 评论(1) 推荐(1) 编辑
摘要: Java实现ArrayList和LinkedList的方式采用的是数组和链表。以下是用C++代码的模拟: 声明Collection接口: 声明List接口 接口声明完成以后就是具体实现。通过C++的模板来模拟Java中的泛型机制,通过嵌套Iterator类实现各自的迭代器。由于在Java中Itera 阅读全文
posted @ 2016-11-23 13:05 冷豪 阅读(1613) 评论(0) 推荐(0) 编辑
摘要: 通过二叉查找树实现排序的例程 阅读全文
posted @ 2016-11-09 16:18 冷豪 阅读(411) 评论(0) 推荐(0) 编辑
摘要: 为了实现多个模块之间的联动,最好的方法是使用观察者模式。网上介绍的资料也比较多,今天我就从另一个方面谈谈自己对观察者模式的理解。从JDK提供的支持库里,我们能够找到四个对象:Observable、Observer、EventListener、EventObject。 先模拟一个后台处理过程: 稍微对 阅读全文
posted @ 2016-10-14 10:53 冷豪 阅读(5980) 评论(0) 推荐(1) 编辑
摘要: 场景1:当有新邮件的时候,网页自动弹出提示信息而无需用户手动的刷新收件箱。 场景2:当用户的手机扫描完成页面中的二维码以后,页面会自动跳转。 场景3:在类似聊天室的环境中有任何人发言,所有登录用户都可以即时看见信息。 与传统的MVC模型请求必须从客户端发起由服务器响应相比,使用反向Ajax能够模拟服 阅读全文
posted @ 2016-07-27 09:32 冷豪 阅读(18095) 评论(13) 推荐(16) 编辑