- 博客(43)
- 资源 (2)
- 收藏
- 关注
原创 记一次图层合并算法设计
一张完整的图像可能是由若干个大小不同的图层组成的。如果由计算机将这若干个图层渲染成一张完整的图像,则需要根据图层的z值(也可以理解为远近关系,z值越大,从视觉角度来看,图层被显现的内容越多),所以,一般渲染过程,就是将图层根据z值进行升序排序,然后从z值最小的图层开始依次渲染。每个图层都是固定大小的矩形(即使生活中我们看到各种形状的图形,它们其实是被包含到一个矩形区域"RGBA画布"中)。 而今天讨论的主题是如何将图层合并,从而减少计算机的计算量(前提:此处可以忽略合并图层带来计算量)。我...
2020-08-16 11:59:12
535
原创 记一次对多字段按照优先级分类再进行排序
在数据查询中,有时候会遇到使用两个或两个以上字段对一组数据集合进行排序,较为合理的处理逻辑应该是先按照字段之间的优先级关系将待排序的数据集合递归地以同一字段的值(同一层)升序或降序的方式进行拆分,然后在以由上往下顺(广度优先方式)序对父节点的叶子节点按照指定规则进行排序。 SQL语句中可以使用order by语句对多个字段进行排序(暂不清楚其实现原理,有可能和上面提到的处理逻辑类似)。该篇文章会讨论一种新的处理手段,将所有参加排序的字段按照指定的优先级关系从低到高以字节填充...
2020-07-26 16:12:09
1456
原创 记一次大数整除
除法的其实也是减法(应该可以这样说),那么大数除法中,该如何判断一个大数能否被数整除呢?(这里说的数指自然数)比如 a(=100000000000000000000000),就不能被 b(=333)整除,(但是计算机硬件不支持这次计算或者计算结果有误),为了方便理解,这里定义一个函数 h(a, b) ,如果h(a, b) == 0的话,则说明a可以被b整除。大数整除的一种思路:跳过无意义的减法运算过程(意思就是比如100/3,100减去10*3后得余数70,如果余数x(70)可以被y(3)整除,则1
2020-06-26 11:04:11
314
原创 素数的判断方法/go实现(4s算出1000w以内的素数)
这篇文章会介绍三种判断素数的方法,其中对第一、二种简单介绍,第三种会详细介绍。特别说明一下, 1不是素数,2是素数。方法一(也是最容易理解的方法):、 若一个数n(n > 2)为素数,则自然数集合 => {[2,]区间}中,一定有一个自然数可以整除n。方法二(素数都是不可整除的,而合数一定可以由素数相乘得到) 若一个数n(n > 2)为素数,则素数集合 => {2, 3, ..., m(m <= )}中的任何素数都不能整除n。方法三(不是合...
2020-06-16 10:36:26
637
原创 数学之美-拼图
质数一个很重要的特点:`除了1和它自身外,不能被其他自然数整除`扩展(1)质数m, n相乘得到s的话,s便不再是质数,但是其因数也是唯一确定,即:1, s, m, n(2)质数集合S => {a0, a1, ..., an} 中任意个不同的质数相乘得s,如果n是一个质数,且n是s的因数,则s可以被n整除。自然数的前100个质数为:2357111317...523541应用场景背景:一块完整的图像被拆散成若干个碎片,而集合中又有若干个这样的图像被拆散。给你
2020-06-07 10:09:56
185
原创 记一次补码的分析总结
补码的运用意义(1) 区分正负数(2) 在固定bit位数下,按照进行加法规则进行运算且计算结果能正确表示,并且在加法基础上支持其它运算(减法、乘法、除法等)补码的一些理解补码更像是一种数值转换规则,"补"仅是针对与负数而言。(通过特定规则将原码的负数转为"补码"的数,然而其加运算过程,看着就像将缺失的1给补上,所以称之为"补码"吧)以 1000 0000和 0111 1111做加法计算为例,按照加法规则,进行运算时,看来就像是将正数的1补充了负数的0,而凡是"溢出"的结果都破坏了补码的.
2020-05-15 09:40:25
151
原创 session管理组件实现[go实现]
回想起MySQL中辅助索引和聚簇索引的关系和php7.0版本中Array的底层数据结构实现,session的底层数据结构也以类似的数据结构组合模式进行session会话的管理,所以用到的核心数据结构为最小堆+Map。使用最小堆的目的是为了session集合进行有效管理,而Map则是为了通过sid快速找到session。(分享一个开发心得:session 不仅占用服务器资源再加上其生产方式,很容易受到网络黑客攻击,所以只给合法的用户在服务端设置session,没通过验证的,我们尽量使用cookie代替sess
2020-05-11 21:44:01
350
原创 [封装]实战gorm
由于gorm不仅支持数据库读写操作,且以面向对象的编码方式实现数据库读写。本片文章从实际开发中所遇问题和新的需要,对gorm进行一次封装操作,以此来加快开发速度。首先介绍代码架构:|-----------------------|- component|-- db.go|-- model.go|-- test.go|- include|-- container.go|-- db.go|- init|-- init.go|- model|-- bean|--- message
2020-05-11 10:23:47
1631
原创 【分享】 使用堆作为底层数据结构来优化”红包分配算法“
我之前的博客中用c语言写了一个红包均分算法,用到的数据结构是链式数组,今日用堆改进此算法-相较稳定的红包算法实现/c语言实现,使用的语言是Go语言。 核心算法相同(不了解的同学可以点击上面链接阅读),所以直接上代码://使用堆完成红包分配算法package mainimport "fmt"//用于影响分配结果的因子var yz float32 = 0type ...
2020-02-18 00:17:48
196
原创 堆排序的实现原理分析(剖析上浮下沉操作, 让你重新认识堆排序)
网络上关于堆排序的算法博客多是给图给真相(因为翻了很多文章还是不清楚,堆排序的过程是什么?所以自己来搞),今天我介绍一下我对堆排序的理解及实战分析。 先介绍一下堆:它分最大堆和最小堆,二者的不同就是父节点和子节点的关系;最大堆要求父节点要比子节点大,而最小堆要求比父节点要比子节点小。其次是堆所依赖的数据结构,它本身是一颗完全二叉树,由于完全二叉树特性,父节点和左右子节点间位置的关...
2020-02-13 22:36:37
1500
原创 记一次“探索MySQL优化器的工作原理”(网上提到的索引失效情况真的一定会发生吗?)
当看见触手可及的结论时大多讨厌尝试那拐弯抹角的过程,所以沿途美丽的风景也可能会错过吧。(测试用的MySQL版本为8.0.18) 今日记录一篇“探索有关MySQL优化器如何工作”的实战经历,这篇文章体现的中心思想就是“MySQL的优化器会按照`最优路径选择算法`给出一个较优的执行计划”,会打破我们的固有思维。第一个知识点(覆盖索引),即存储引擎仅通过检索(相关知识点`ICP`)...
2020-02-07 14:29:38
137
原创 一次场景模拟/go实现
无论是生产者还是消费者各自是独立的,但彼此又相关联。今日我用go语言模拟一个并发的生产和消费场景。 背景是这样的: ``` 有一个生产饮料的工厂, 工厂里有2个生产机器, 每生产一个产品要花费1h,生产的产品会自动放到仓库中,仓库可容纳5个这样的产品,有3个员工,他们每一个人需要花费0.8h将1个产品搬运到小区中地摊上等待售卖,每隔1.5h会有一个顾客来到摊...
2020-02-04 23:54:47
252
1
原创 记一次算法优化
这段时间刷了刷letcode,编程的乐趣可能就是`它就在那儿,而你要征服它`(哈哈哈),刷过一道题时,会有种莫名其妙的快感!本篇文章记录了我刷的一道算法题并经历不断优化和改进且最终"攀顶"的历程。题目优先:letcode-44_通配符匹配题解:我的题解'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。示例:(抄自 letcode)输入:s ...
2020-01-25 14:23:14
504
原创 八皇后-go实现
八皇后游戏规则说明: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(百度百科)延申到n皇后,规则已知,算法的空间复杂度为O(n^2), 空间复杂度为O(n),package mainimport "fmt"//判断该位置是否满足八皇后规则func eJudge(e []int, i int)...
2020-01-22 21:40:47
230
原创 白盒用例测试程序/go实现
简单介绍一下白盒测试: 源码公开,清楚传参、返回值和处理逻辑;我们在测试一个方法或者接口时,通过传入合法或者非法的参数,并且抽选一些具有代表性的值作为测试用的合法传参,通过模仿正常请求,检测方法或接口内部的异常。周末没事,又想学习一下go,最近又老写bug,所以就想到用go写一个测试进程,实现白盒`用例`测试用到的数据结构简单介绍一哈:用Clinet表示一个正常的客...
2020-01-04 17:22:44
450
原创 数学之美-唯一ID生成算法
一切的合理性都可以通过数学来解释(自己瞎编的),今天就用数学给大家变个戏法,实现一个唯一ID生成器;而用到的数据知识包括排列组合+质数特性应用: 先给出一个数学定义:在一个质数集合中随意取出2n个质数,让他们两两相乘然后加和得m,放入后重新再取出2n个质数,经过相同步骤计算得出z,除非前后取出的质数相同且两两相乘的组合也相同,否则m != z(我拿着笔经过一阵噼里啪啦,验证得来的)。...
2020-01-02 23:25:17
1541
原创 snowflake算法变种/php实现
snowflake是一种分布是唯一id生成算法,简单而又强大。但其依赖实体主机作为标识,而导致了唯一id的组成部分中关于mechine的部分需要实体主机的标识符来映射对应的二进制数值才能正常提供服务(其算法的本意)。而本程序改进如下,借用redis的string类型的key来代替这部分`mechine部分二进制数值`,当一个snowflake唯一id生成器服务进程启动时,会先随机获取一个m...
2019-11-03 12:16:20
486
原创 PHP内核分析-变量+引用+写时复制+变量分离
变量PHP5 变量的内部实现 变量存储结构:typedef struct _zval_struct zval;...struct _zval_struct { /* Variable information */ zvalue_value value; /*变量的值的存放容器*/ zend_uint refcount__gc; ...
2019-10-10 18:29:25
261
原创 延迟和高并发导致的不”幂等“场景及解决方案
延迟导致的“不幂等”问题场景描述: 一个用户对一个商品进行下单,出于各种原因,在较短时间内,用户多次点击了下单按钮,如果手机端没有预防该情况的发生,那么将会产生多个相同的请求(请求接口相同+请求参数相同),如果服务处理不当将有可能产生多个订单,致使脏数据生成,可能导致应用服务的其它功能异常(风险不可评估)。场景分析: 一个合理的下单步骤包括三步骤:商品选择...
2019-09-11 00:35:23
827
原创 相较稳定的红包算法实现/c语言实现
红包的分配分布,个人认为能够运用到正态分布是极好,运气好的人少,运气差的人也少,但是本篇算法并不打算利用正态分布的特性来实现分配红包算法(本人太菜),而是一个产生红包相对稳定,一定程度上也算一个是符合正太分布特性的算法(世间很多事物的分布一定程度上都满足正态分布,我的理解:1、总量是固定不变的(具体特性记不得了),;2、分布呈现的是两边少,中间多;)。下面介绍以下该算法的思路中涉及比较重要的点...
2019-08-31 13:02:16
678
原创 RabbitMQ的一次封装/基于php-amqplib一次开发
RabbitMQ实现了AMQP协议(高级消息队列协议)。基于我对RabbitMQ的理解: 其基本组成结构有:publisher(生产者)、exchange(交换机)、queue(消息队列)、consumer(消费者) 各个数据结构介绍: publisher(生产者): 作为消息的产生者,产生消息存于消息队列中,生产的过程就是厂家将商品出货。 ...
2019-08-24 15:07:57
1400
原创 设计模式_builder变种模式使用实例-SQL构造器
把一条基本的SQL语句(不包括子句)抽象成一个类,这里的SQL类由select的`fields`, from的`table`, join`table`on`condition`, where的`condtion`, order by的`field desc, field asc`, limit `offset, length` 六部分组成(可支持扩展 `group by`\`having`\uni...
2019-08-14 00:14:27
226
原创 利用模块方法模式初探业务逻辑处理模块
因为阅读yii2源码过程中,不理解其设计模式(导致阅读起来比较吃力),介绍其其中用到的一个设计模式:模块方法模式.模块方法模式概念: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤(引用:菜鸟教程)。在学习过程中设计一个业务处理逻辑模块。目录结构:/index.php demo文件/autolo...
2019-08-11 22:48:21
290
原创 使用php依赖注入实现
首先需要了解什么是依赖注入,在这里我只能copy比较不错的定义如下: 依赖注入(Dependency Injection),组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。(引用:控制反转和依赖注入的理解(通俗易懂)) 通过阅读yii...
2019-08-11 11:13:14
308
原创 代码风格养成-初识
关于代码风格的认识,如果学过汇编的话都会知道,一个子程序只有一个入口和一个出口,高级语言无论怎么return都不过是跳转到出口的位置;而一个函数不仅有入参,理应也有返回值(虽然代码中可以不返回任何值),基于一段时间的开发经验,然后突然来了灵感想了一套不错的代码风格和一丢丢web开发框架的思想;代码如下:<?php//代码风格养成篇-初识//err的抽象定义[err并...
2019-07-30 23:49:26
158
原创 词法分析器实现[c++]
#include <stdio.h>#include <stdlib.h>#include <fstream>#include <vector>#include <map>#include <string.h>using namespace std;//约定:每一行程序以 \n结尾//约定:标识符的最大长...
2019-05-26 13:07:35
203
原创 redis--分布式锁; key约束_改进(规避锁无生命周期的问题)[php]
继redis--分布式锁; key约束_改进(减少临界资源被多个进程使用)[php]解决了释放锁时,版本不同问题,而可能造成的催生更多的多个进程同时访问临界资源问题,而本篇在此基础上,解决在加锁时候出现的进程奔溃问题而最后创建了key却没能expire,而造成其它进程一直获取不到锁的问题。<?php/*---------------------- 上一篇出现的一个解决的问题...
2019-05-19 17:00:21
208
原创 redis--分布式锁; key约束_改进(减少临界资源被多个进程使用)[php]
这里的临界资源指的是(获取锁成功的处理流程,不过并不是整个过程都涉及资源的争用情况,因为你也不想坐电梯[自己想去一层的],到了二层的时候才去按一层的按钮,而在按下之前的瞬间电梯已经决定往上走了,因为楼上有人想下去~ hiahia...)<?php/*---------------------- 上一篇出现的一个问题就是,当因为进程操作时间过长,而导致所自动释放,超时进程又误...
2019-05-19 15:06:26
393
原创 redis--分布式锁; key约束[php]
<?php/*---------------------- 使用创建锁key代替watch*//** * @define lock的定义,对商城商品进行加索 *//*----------------- 常量定义*/define('USER', 'user:');define('INVENTORY', 'inventory:');define('MARKET', 'mark...
2019-05-19 14:56:36
183
原创 PHP 命名空间使用--规约探索
探索一:namespace 有无的区别:假设:在一个Application.php 中定义一个class Application, 且申明命名空间,如下:<?phpnamespace app;class Application{ protected function getClass() { return __CLASS__.PHP_...
2019-05-19 12:10:32
434
原创 redis--分布式锁; watch实现[php]
<?php/*----------------- 常量定义*/define('USER', 'user:');define('INVENTORY', 'inventory:');define('MARKET', 'market');/*----------------- 公共方法*/function log_($message) { printf($message....
2019-05-19 11:53:37
510
原创 简单的加密/解密算法_/c++
关于加密和解密问题,有的加密算法是不存在解密算法的(原因就是加密算法的不可逆性,即无法通过算法将密文还原),有的加密存在解密算法(原因是其加密过程是可逆的,即可以通过逆向算法将密文还原)。然而单独的一种加密算法不一定可靠,这时可以将多种加密算法组合使用。至于相关的加密算法各位自己去了解。 下面介绍一个简单的加密/解密算法实例,希望对此加密解密算法有一定认识: ...
2018-02-09 15:45:12
8349
原创 C++算法学习/约瑟夫问题之找出最后的存活者
游戏规则:n个人围成一个圈,从第1个人开始重复数数,每一次数到2(请注意!这和经典的约瑟夫问题不同!),就杀掉这个位置的人,而留下其他的人。但是约瑟夫本人不愿意这样被杀掉。他确定了最后幸存者的位置,并且站在那儿。我们记活下来的人的位置编号为 A。(来自实验吧)程序如下:#include using std::cout;using std::endl;//程序测试int main
2017-11-19 10:05:39
1213
原创 C++算法学习/约瑟夫问题之坏人必须死好人不能死
游戏规则为:总共有2 * k个人报数,前面k个是好人,后面k个是坏人,从第一个好人开始报数,报道m的人要死去。然后从死人的下一个活人继续从头开始报数,报道m的人死去,以此类推。当k = 12时,问m为何值时,坏人全部死去之前不会有好人死去。(来自实验吧)程序如下:#include using namespace std;const int P = 24;int per[24];
2017-11-19 09:35:13
2562
原创 C++学习日记/4类排序算法
#include using namespace std;void Swap(int& a, int& b){ int tmp = a; a = b; b = tmp;}void print(int* arr, int len){ for(int i = 0; i < len; i++){ cout<<arr[i]<<", ";
2017-11-18 09:50:18
197
原创 c++学习日记/函数指针与指针函数
#include using namespace std;//指针函数 1 将函数临时变量的地址赋给指针,可能发生意外错误!!int* getElem_E(int n){ //将n的值赋给一个int变量 int tmp = n; //ptr 指向 tmp地址 int* ptr = &tmp; cout<<"引用的是形式参数ptr = "<<ptr<<
2017-11-17 22:13:31
167
HFS_网络文件服务器
2017-08-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人