自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

实践是检验真理的唯一标准

c++, python, 数据结构与算法,自然语言处理与数据挖掘,系统架构,软件架构。

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

原创 python手写kmeans算法

kmean聚类是最基础和常见的算法,工程上使用比较常见,spark, sklearn都有实现,本文手写实现kmeans#!/usr/bin/pythonimport sysimport randomimport mathdef create_rand_points(max_x, max_y, count): """Create count points (0-x), (0-y). """ points = [] for i in range(0, count

2021-01-12 16:43:49 562

原创 今日头条面试算法题

题目:给定一个整形数组,数组是无重复随机无序的,要求打印出所有元素左边第一个大于该元素的值。

2017-05-10 17:36:29 12898 3

原创 linux c/c++ 后台开发常用组件之:c++日志模块

日志是后台开发中必不可少的功能,几乎每个公司或者部门都会有自己的日志模块,开源的c++日志有log4cplus, 这是自己在一个项目中写的一个日志类,整体性能还是不错的功能相对比较简单点,但是使用基本没什么问题,性能也还挺高。日志在排查线上问题有不可替代的作用,也是用户数据最终也的来源。日志通常一个进程只会有一个,所以该类时一个单例模式,可以实现按天和日志条数自动分文件,目前还不支持压缩等功能。但是通常工程使用应该完全能够满足,因为其他的像压缩,自动删除日志等日志功能,可以通过脚本程序完成更加方便运维。

2013-05-17 11:28:44 8446 3

原创 linux c/c++网络编程之—epoll 模型

linux 内核2.4版本以上开始支持epoll, epoll相比select性能有较大的提升,首先支持的连接数基本不受限制,只受到内存等系统资源的限制,epoll是一种异步通知机制,只有有网络事件发生了,就会主动加入监听集合,select需要轮询事件集合,这样效率会低很多,尤其连接数多,但大部分连接不活跃的情况,select 的效率会低很多。目前大部分的linux网络库,底层都是epoll实现。下面只是一个最基本的epoll例子。

2013-05-17 11:18:55 9726 2

原创 linux c/c++网络编程之—select模型

于select模型,大多都是说他的缺点,实际上我的观点有点不一样,select模型的跨平台性是比较好的,开发也比较简单,只有当个进程连接数的限制,以及其性能随着连接数增长下降的问题,实际上都得根据项目的实际情况而定的。在内部分布式通讯中,几乎所有的连接都是活跃的情况下,select模型并不比epoll的性能差,只是在一些应用中大部分连接都不活跃的情况,epoll的使用效果要高,可以使单台服务器的承载量大大增加,实际上游戏服务器中玩家绝大部发是活跃的,因此实际性能也还不错。不同场景可以选择不同模型,最终还是根

2012-12-02 21:21:40 9776 3

原创 高可用,高性能,线程安全,自动数据恢复 redo log 类

在金融,电商,等高可用环境下,不允许有任何数据丢失的情况,redo log 是一个不错的低成本高可用方案,其作用有点类似mysql binlog, 下面在生产环境中事件和优化的多线程安全,自己恢复的 c++ redo log 类,在实际生产过程遇到相应问题,很多地方进行优化设计,尽量保持高性能和高可靠性。

2016-09-06 22:51:03 645

原创 linux c/c++ 后台开发之—连接池

在互联网后台开发中经常需要需要范围一些公共资源,如DB,cache, MQ, 最典型的的就是mysql, memcached, redis, 以及一些代理服务;通常在高并发,高访问量的情况下,起停连接,是不合适的,也容易将连接占满, 尤其是工作线程多的情况,如果每个工作线程建立连接,如果服务多的情况会使得连接不够用,而且连接有时候会出现空闲的情况;连接池的作用就是保持一定数量的连接,提供给多线程服务使用,通过压力测试配置合适的连接数量,实现性能和资源的最优化。

2016-04-15 19:03:09 5340 1

原创 Linux mysql c API封装

mysql 是目前使用量最大的关系型数据库,在互联网公司应用非常广泛,在一些非高并发场景下应用MySQL能大幅降低开发运维和部署的成本。下面是自己封装的c++ 风格的MySQL客户端,相对原生的c api 使用相对更加简便一些

2016-04-15 15:57:18 2018

原创 随机算法之—结果集中随机取出N个结果

随机算法在互联网产品中随处可见,验证码就是其中一种,还有很多随机出结果的场景,数据挖掘的随机抽样等等而其中非常常见的一种就是在一个大的结果集中随机高效抽取N个结果下面是自己实现的,在工程中使用的随机取N个结果的随机算法#include#include#includeusing namespace std;templatevoid rand_n(vector& src, int r

2015-12-18 17:24:03 871

原创 shuffle算法及应用

shuffle算法(洗牌算法)就是将顺序打乱,一个典型的应该就是音乐播放器随机播放,而在机器学习,数据挖掘,做抽样的时候需要shuffle, 一个好的shuffle算法主要是保证时间复杂度是最小的

2015-12-18 16:58:54 2278

原创 linux c/c++ 后台开发常用算法之:一致性哈希算法

一致性哈希主要应用在大规模高可用性的分布式存储上,尤其是KV存储上面,比如memcaced, redis 集群,相比普通hash % N 的优点在于,但动听增加或者删除节点的时候,数据的迁移会比较小,通常只有部分抖动和迁移。但是其相对于hash %N 的缺点数据均匀性肯定不如 hash %N 尤其是数据的key在一个较小的范围内,容易出现均匀的现象,但是可以通过hash函数调优,以及增加虚拟节点的方法来降低不均匀性。下面试自己写的一个c++版本的一致性哈希算法

2015-11-05 23:16:46 2603

原创 linux c/c++ 后台开发常用算法之:md5算法c++版实现

MD5即Message-Digest Algorithm 5(消息摘要算法第五版)的简称,是当前计算机领域用于确保信息传输完整一致而广泛使用的散列算法之一(又译哈希算法、摘要算法等),主流编程语言普遍已有MD5的实现。将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础, 下面是c++版的MD5算法实现#include

2015-11-05 22:56:21 2914 1

原创 linux c/c++ 后台开发常用组件之: 高性能local cache

缓存在后台开发中是经常使用的,通常有通用的缓存服务,开源的有memcache, redis, 但是在数据量不是特别大,性能要求极高的情况,以及减少搭建和维护专门的缓存服务的成本,本地缓存具有很好的性能以及减少运维成本,本地缓存可以显著的减少网络开销,带来更高的性能,还可以避免缓存服务单点问题 ,下面是自己封装的一个基于LRU缓存淘汰算法的多线程安全LRU缓存组件,已经在项目中使用。

2015-10-27 20:53:11 3886 1

原创 linux c/c++ 后台开发常用组件之:高级字符串处理库

字符串是目前处理是目前工程项目中出现最多的问题,尤其是自然语言处理,文本处理和分析等等,c++目前只提供比较简单的字符串处理函数,不像Python,Java对字符串操作功能强大,下面是自己封装的几个常用字符处理的函数,其实功能实现应该有很多种,但是由于字符串处理是基础函数,需要适当的考虑算法实现的性能。下面是自己实现的一些功能,性能感觉还不错。/***********************...

2015-08-31 23:40:35 1507

原创 阿里巴巴面试题,rpc请求保序接收算法

分布式系统中,数据经常到达顺序不一致,所以经常需要优先处理先到的有序数据,而不是等所有数据都到了再处理,这个算法在很多的场景比较适应,可以提高系统的吞吐量

2015-04-06 10:07:56 2694

原创 c++ STL 工程实践的15条建议

STL是c++非常重要的一部分,它是很多大神的杰作,高效,稳定,可扩展性好,虽然STL确实存在难以调试,内存碎片的问题(现在机器的内存越来越大,内存碎片的问题基本不太可能成为系统瓶颈,但只要你使用恰当,它能显著提高生产力,并使代码更短,更易维护。而在工程中,如果不养成好的使用习惯,也容易造成一些问题!

2014-12-06 20:20:34 1203

原创 linux c/c++ 单机和集群memcached客户端

单机和集群分布式memcached 客户端封装

2014-11-14 15:08:26 3701

原创 linux c/c++ 后台开发常用组件之:高性能阻塞队列

阻塞队列是后台开发中多线程异步架构的基本数据结构,像python, java 都提供线程安全的阻塞队列,c++ 可能需要自己实现一个模板。从性能考虑,自己没有使用STL的queue作为基本数据结构,而是使用循环数组作为基本数据结构,性能应该比queue高,省去了动态内存分配和回收。确定就是,队列大小不可动态扩展,实际开发中,可以通过压力测试,配置合适的队列大小。代码量非常小,可以进行工程开发直接使用。

2014-11-13 23:37:24 6552

原创 linux 下pyhton 删除指定目录下所有的重复内容的文件

#!/usr/bin/pythonimport sysimport osimport filecmpif __name__ == '__main__': """Delete the dups files. """ if len(sys.argv) != 2: print 'input the dir' all_files = [] for a,b,c in os.wal

2013-12-28 19:03:07 716

原创 多线程共享数据的更新的解决办法

一个线程负责取数据,每次new 一个新的buffer,接收全量或者增量数据,用一个临时指针指向之前正在使用的数据,新的buffer加载好后,将使用数据的全局指针指向新的buffer,(在切换成新指针的时候加上写锁,其他的地方加上读锁)再delete 临时指针(释放老的数据),这个方法在我之前的一个项目中运行很长时间重来没有出现过问题,这样实现了共享数据只在切换的时候加上写锁,其他地方只有读锁,显著的减少了锁竞争,和锁粒度。实现了数据更新的无缝切换。此方案在数据一致性要求非常严格的场景并不适应,只是适应不经常

2013-12-14 13:27:54 2317 1

原创 c++ 工程基础之STL系列 (四) map

map在实际工程中应用非常广泛,基本上都会使用到,起内部实现是红黑树,查询和插入,删除复杂度都是log2(n),尤其在查询操作中非常方便,性能也很高#include#include#includeusing namespace std;int main(){ map a; map b; //插入有两种方式 a[0] = 0;a[0] = 0; a.insert(pa

2013-12-14 13:06:02 690

原创 c++ 工程基础之STL系列 (三) set

set也是在工程中常用的数据结构,在需要快速查找和插入的场景,也适合一些排重和需要按关键字排序插入的场景。multiset使用的场景应该不是太多,下面主要介绍下set中一些常用的方法。#include#includeusing namespace std;struct node{int key;int value;bool operator {ret

2013-12-07 20:06:48 697

原创 c++ 工程基础之STL系列 (二) list

list内部数据结构是一个双向循环链表,这样的数据结构在插入和删除上的时间复杂度相对vector会更好些,但是其两个指针占用的内存会更大一些list在实际工程中主要应用在大量的插入和删除操作的场景,例如缓存淘汰LRU算法就可以用list实现。

2013-12-07 15:27:03 689

原创 c++ 工程基础之STL系列 (一) vector

STL在c++实际工程中很重要,可以提供开发效率降低维护成本,实际开发中可能大家并不需要了解其内部实现,但了解大概的数据结构还是有好处的。首先讲下几个在工程中STL的几个典型问题: 1.判断容器为不为空empty() 复杂度是O(1),  而用size() == 0可能是O(N);2.clear()并不能释放内存,用swap空容器释放3.局部容器在跳出作用域将自动释放容器内存4.n

2013-12-07 13:29:30 985

原创 几个常见计算机的术语的理解

1.在工作中和教科书上经常提到几个基本概念,并发,并行,阻塞,非阻塞,同步,异步。实际上很多同学都没搞清楚这几个概念,有时候容易搞混淆我也只是凭自己对他们的认识,解释下他们几个概念:并行:实际很好理解,就是同时进行,实际上在同一台机器并行运行在单核时代是不可能得,当然显卡中很多是并行运行的。而在多核时代,并行运行是可能的,不同线程,进程可以在不同核心上并行运行,这也提高了多任务

2012-12-02 21:50:42 1038

原创 linux c/c++网络编程之—线程池模型

网络编程是一个程序员必须掌握的一项技能,尤其c/c++程序员必须掌握,而实际应用中,绝大部分网络程序都不可能是单连接,那么就意味着需要处理并发问题,目前来说主流的linux下的网络模型基本都基于epoll,select,在大规模并发情况下性能较高,而多进程,多线程模型相对较少,多进程模型实际使用确实较少,进程间通讯和数据共享都不太方便,而多线程模型在小连接数,尤其在内部通讯还是有可取之处的。

2012-12-02 20:59:11 2324

原创 数据结构与算法之—循环队列

队列是软件开发中最常见的一种数据结构,先来先服务,以及任务调度的一种最基本的方式。下面是一个循环队列模板类

2012-10-21 12:33:02 558

原创 栈的应用,实现简单的不带括号的四则运算

#include#includeusing namespace std;int f(const char* str, stack& s){ int i = 0; while(str[i] != '\0') { if(str[i] == '*') { char t = s.top(); s.pop(); t = (t-'0') * (str[i+1] -

2012-09-03 23:18:12 1966

原创 数据结构与算法之—两个栈实现一个队列

曾经的一个面试题,队列是一个异步架构很重要的一个数据结构,其底层的数据结构可是是数组,链表,还可以是栈

2012-09-01 21:10:19 445

原创 数据结构与算法 之二叉树(二)非递归遍历算法

二叉树是一种基本的数据结构,其实很多复杂数据的基础,如红黑书,多叉树,B树等,而查找是最基本的算法,前面写过递归查找算法,下面是非递归二叉树查找算法,非递归算法的优点就不说了,最主要的是非递归算法能让我们更加了解二叉树的结果和原理。

2012-09-01 12:17:24 624

原创 数据结构与算法之 二叉树 (一)递归算法

#includeusing namespace std;struct tree_node{ int data; tree_node *lchild; tree_node *rchild;};void create_btree(tree_node** b_tree){ int c = 0; cin>>c; if(c != 0) { *b_tree = new tre

2012-09-01 11:46:05 426

原创 经典c/c++面试题atoi

#includeusing namespace std;int my_atoi(const char* str){ int sum = 0; int len = strlen(str); if(str[0] >= '0' && str[0] <= '9') { for(int i = 0; i = '0' && str[i] <= '9'); i++) { sum =

2012-09-01 09:28:37 562

原创 数据结构与算法之—顺序栈c++面向对象实现

#includeusing namespace std;templateclass my_stack{public:my_stack(int n = 10);~my_stack();bool empty()const;bool full()const;bool push(const T& element);bool pop();bool ge

2012-08-26 16:50:51 473

原创 数据结构与算法之单链表 自己实现STL list模板类

自己写的一个简单的单链表模板类,类似STL功能,不过是单链表,与真正的STL肯定很大区别,只是自己模仿一下而已。#includeusing namespace std;templatestruct node{ T element; node* next;}; templateclass my_list{ public: my_

2012-08-18 19:14:40 1178

原创 数据结构与算法之链表(四) 约瑟夫环

在一些大的公司尤其是大的互联网公司面试的时候,链表的一些趣味算法是经常出现。约瑟夫环和判断是否有环经常出现在面试题中。

2012-08-12 11:49:47 943

原创 数据结构与算法之链表(三)单链表反转

1.单链表翻转2.找出单链表倒数第K个节点

2012-08-06 17:18:33 1502 4

原创 数据结构与算法之—链表(二) 有序单链表合并

#includeusing namespace std;struct node{ int element; node *next;};node *create_list(int n){ if(n <= 0) { return NULL; } node *head = NULL; node *p = new node; if(p == NULL) {

2012-08-05 15:41:57 1134

原创 数据结构之链表(一)创建,插入,删除

链表是一种十分常见的数据结构,也是非常灵活的一种数据结构,应用十分广阔,在实际工作会经常用到,尤其保存映射关系时非常方便和灵活,经典的论坛拉链结构就是一种高效的和灵活的链表结构。

2012-08-05 10:57:48 616

原创 算法与数据结构 之数组(三) 趣味算法

1. 曾经面试的时候被问到一个天,就是将一个整形数组中的偶数全部放在前面,而且要保持之前的相对顺序,要求时间和空间复杂度最小#include#includeusing namespace std;void even_num_first(int a[], int n){ for(int i = 0, j = 0; i < n; i++) { if(a[i] %

2012-07-22 19:19:28 613

原创 数据结构与算法之—数组(二)

实际上下面几个数组操作在实际工作中都有一些应用的:就拿求两个有序数组的集合的交集来说, 我之前在一家公司呆过,做过短时间的公交项目,其公交换乘算法就,用到了有序整数集合求交的方法,在我未接触公交项目时还以为是什么图的相关算法,跟我想法大相径庭,确实没必要用图的相关算法,有更为简便和高效的算法。 就最简单讲下,最简单的情况吧,把每个站点经过的线路的ID有序排列,那么要求两个站点的公交的线路ID的交集

2012-07-22 14:18:48 768

空空如也

空空如也

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

TA关注的人

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