- 博客(60)
- 收藏
- 关注
原创 关于python的作用域(Scope Resolution)
1、四种作用域及其生命周期:(1)local(本地局部作用域),即函数中定义的临时变量,当函数结束时,变量的生命周期结束。(2)enclosed(闭包,嵌套的父级函数的局部作用域),即闭包外层函数的局部变量,外层函数结束,变量的生命周期结束。(3)global(全局变量),即模块级别定义的变量,模块销毁,变量的生命周期才会结束。(4)bulit-in(内置函数)是python解释器,虚拟机内置的变量。搜索变量的顺序是:(1)->(2)->(3)->(4)2、global关键字的
2021-03-12 13:21:16
697
1
原创 python中的一些小坑
个人微信公众号:程序员宅急送1、tuple嵌套tuple类型一定要记得逗号a = ((1))b = ((1),)这两个看起来好像也没什么差别嘛,就是一个都好而已打印出来的结果却差很多!print(type(a))print(a)print(type(b))print(b)"""<class 'int'>1<class 'tuple'>(1,)"""2、list运算时候的小坑a=[1,2,3]b=a;a+=[4,5,6]# a = a+[
2020-05-31 22:08:02
313
原创 如何简单的理解动态规划?
个人微信公众号:程序员宅急送之前的几篇文章我讲了分治,回溯,贪心三个思想,今天我将最后一个动态规划。一、什么是动态规划?动态规划是一种类似于回溯的思想,他通过空间换时间的方法提高效率,一般用于求最优解问题。二、动态规划能解决什么类型的问题?在上面我说道,动态规划其实和回溯很类似。回溯思想在前面的文章我提到过,回溯是一种穷举可能的方法。动态规划则是通过额外的空间将回溯的递归树中不需要的可能提前剪除达到提高效率的目的。我们来回忆一下回溯能解决的问题的特征1、重复子问题(能够分成一个一个重复的阶
2020-05-31 22:04:42
509
原创 敏感词屏蔽——AC自动机
个人微信公众号:程序员宅急送一、算法介绍上一周我们讲了Trie树,这次的AC自动机是Trie树的一个改进版,也是一个多模式串匹配算法。区别在于Trie树——在一堆模串中找寻符合条件的前缀(搜索引擎的关键词弹出选项)AC自动机——找寻符合条件的后缀。二、算法讲解1、首先我们构建一个如图的Trie树如下图2、在学习KMP算法的时候,我们说到了好前缀的前缀子串和后缀子串匹配。在Tr...
2020-04-20 01:00:29
871
原创 搜索引擎的搜索关键字提示功能——Trie树
个人微信公众号:程序员宅急送百度、Google我相信大家都用过,在搜索框中输入一个字就能弹出很多可选的关键词,如下图像这种关键词搜索功能最底层的数据结构就是我今天要说的:Trie树。一、什么是Trie树?简单点说就是个多叉树。我们把每个字符串中重合的前缀合并在一起形成的多叉树!二、画个图说的话有些麻烦,我们直接来看图!三、代码实现typedef struct _TrieNod...
2020-04-20 00:58:50
507
原创 字符串匹配算法——KMP算法
个人微信公众号Geek_Zhai核心思想:KMP 算法就是在试图寻找一种规律:在模式串和主串匹配的过程中,当遇到坏字符后,对于已经比对过的好前缀,利用字符串的特点,尽可能多滑动几位,提高效率(听起来好像和BM算法差不多)算法讲解:KMP算法与BM算法最大的不同在两点1、从前往后匹配2、利用好前缀的前后缀子串最长匹配规则如下图与BM算法一样,这里的前后缀最长匹配长度,我们也可以提...
2020-04-20 00:55:42
219
原创 字符串匹配算法——BF算法(暴力匹配)
字符串匹配算法——BF算法(Brute Force)欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_Zhai核心思想:假设我们主串长度为n,模串长度为m,BF算法就是要去遍历主串的n个字符,每次都再循环比对n-m+1个字符,所以时间复杂度是n*m;原理如下图:代码如下:class Solution{public: int BF(const string& s...
2020-04-06 11:58:19
654
原创 字符串匹配算法——RK算法(Rabin-Karp)
字符串匹配算法——RK算法(Rabin-Karp)欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_ZhaiBF算法的特点就是简单粗暴直接,好理解,它的时间复杂度是O(n*m)。那能不能再优化一下呢?再快一点!这就是本篇文章要讲的RK算法(Rabin-Karp),这其实是两位大佬的名字。算法核心思想:利用哈希值匹配更快的优点来加快字符串匹配的速度。我们先求出主串所有长度与模串相...
2020-04-06 11:57:29
2064
原创 字符串匹配算法——BM算法
字符串匹配算法——BM算法欢迎关注个人公众号:程序员宅急送公众号微信号:Geek_Zhai核心思想:利用字符串的特点,跳过绝对不可能匹配的字符(多移动几个字符),提高效率。算法讲解:BM算法有两大规则:坏字符规则和好后缀规则1、坏字符规则图解如下光有坏字符是不够的!因为坏字符可能会出bug,让你后退着滑动…如下图2、好后缀规则鉴于坏字符规则可能出现的“倒滑”问题,我们需...
2020-04-06 11:53:10
576
原创 cocos2dx架构一瞥—程序架构、实时更新、主线程
本文接上一篇cocos2dx架构一瞥——Node类、坐标系及UI树。本文是阅读《我所理解的cocos2d-x》第二章——Cocos2dx架构一瞥的2.4、2.5、2.6小章节后的总结。(参考书籍《我所理解的cocos2d-x》,秦春林著)(文中cocos2d-x版本为3.17)六、应用程序架构1、游戏生命周期在cocos2dx中,一个游戏对应的是一个Application对象。但是我们...
2020-03-22 17:59:19
584
原创 cocos2dx架构一瞥—Node类、坐标系及UI树
本问是阅读《我所理解的cocos2d-x》第二章——Cocos2dx架构一瞥的2.3小章节后的总结。(参考书籍《我所理解的cocos2d-x》,秦春林著)(文中cocos2d-x版本为3.17)一、Node类cocos2dx支持在屏幕上绘制精灵、文本、形状、粒子、地图等,所有这些对象都继承自Node类,Node类定义了元素的布局、变换、坐标等系统二、Position和anchorPoin...
2020-03-22 17:58:45
515
原创 二分法在循环有序数组查找元素
//在 O(logN) 时间内,从循环有序数组里查找元素//二分之后,总有一半是有序数组public static int searchInLoopSortedArray(int[] nums, int target) { if(nums.length == 0) return -1; int low = 0; int high = nums.length - 1;...
2020-03-02 11:13:41
446
原创 如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。
如何使用二分法实现“求一个数的平方根”?要求精确到小数点后 6 位。//precision精确度//a原数据double squareRoot(double a , double precision){ double low,high,mid,tmp; if (a>1){ low = 1; high = a; }else{ ...
2020-03-02 11:12:13
3792
原创 剑指offer——在一个二维递增数组中查找一个数
剑指offer——在一个二维递增数组中查找一个数题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数解题思路:因为二维数组,从左至右,从上至下递增。从上往下每一行遍历,当遍历到比target大的数字是,说明target只会出现在左下那块地方。然后缩小范...
2020-02-28 12:47:26
301
原创 最短路径:地图软件是如何计算出最优出行路径的?—— Dijkstra 算法 。
一、算法解析:我们可以把地图抽象成一个有权有向图,每一个路口都是一个图的顶点,每一条两路口之间的路的距离就是边的权重。路的行驶方向就是边的方向。那么我们求最优出行路径就可以转化成在一个有向有权图中,求两个顶点之间的最短路径。二、举例如下假设我们有下图这样的有权有向图,我们要从起点0到终点5找到最优(短)路径三、算法解析,Dijkstra 算法 ,准备如下:1、我们代码建立如下图的邻接...
2020-02-17 16:10:25
1724
原创 如何实现一个简单的音乐推荐系统?——利用欧几里得空间距离算法(向量空间距离)
举例如下:音乐推荐的两种推荐方式第一种:基于相似用户做推荐如何判断两个用户是相似用户?我们可以根据两个用户对一些随机的歌曲的喜爱程度进行相似度度量。一个用户对一首歌单曲循环记5分,分享记4分,收藏记3分,搜索记2分,听完记1分,没听过记0分,直接跳过记-1分; 安静 晴天 十年 后来你 5 3 3 0小明4 5 2 1那么你和小明的欧几里得距离就是(5−4)2+(3−...
2020-02-17 12:21:03
677
1
原创 拓扑算法
拓扑算法一、用途拓扑排序应用非常广泛,解决的问题的模型也非常一致。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。除此之外,拓扑排序还能检测图中环的存在。例如:先穿内衣再穿外套,先穿袜子再穿鞋子,先穿内裤再穿裤子。根据局部顺序推导全局顺序为:内衣->外套->袜子->鞋子->内裤->裤子(结果不止一种,因为先穿袜子还是内衣没有顺序)二、原理把依...
2020-02-13 22:25:49
4299
1
原创 Redis的跳表
Redis的跳表#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string>#include <cstring>#include <random>#include <ctime>using namespace st...
2019-12-31 16:19:36
205
原创 二分查找变体问题
二分查找变体问题假设数组是这样的(有重复){1,3,4,5,6,8,8,8,11,18}class Solution {public: //第一个等于给定值的值 int firstEqualSerach(int a[] ,int n,int value) { int low = 0; int high = n - 1; while (low <= high) {...
2019-12-31 00:03:14
168
原创 打印出一个数的每一位
打印出一个数的每一位#include <iostream>using namespace std;int main( ){ int a = 42; unsigned p = 1;//此处注意,我定义为无符号int是为了在后面右移的时候使用逻辑右移,符号位保持0 p = p<<31; for(int i =0;i<32;++i)...
2019-12-10 14:38:22
200
原创 归并排序
个人理解:归并排序也是运用分区的思想,1、计算出一个中间点,然后左右分区2、不停地递归分区,直至无法分区3、当无法进行分区的时候,根据下标进行比较大小,存入临时数组4、递归返回阶段,每一次返回都会进行比较,存入数组归并排序是从下到上,需要一直递归分区直到无法再分区,再进行排序。图解:时间复杂度:最好最坏平均时间复杂度都是0(nlogn)空间复杂度 O(n)是否是稳定的排序?...
2019-12-05 17:58:24
135
原创 快速排序
个人理解:快速排序也是运用分区的思想,1、首先选择一个分区点或者叫做中间点,任意的都可以(因为最后会在中间位置交换)2、从头遍历数组,把比分区点小的让左边,比分区点大的放右边(这个时候,左右两边依旧无序,但是左大右小)3、把分区点放中间4、把左右两边继续进行快排(递归进行分区,左小右大,递归分区的时候是不会把前一次的分区点算进去的)5、分区越来越小,顺序越来越精准。与归并排序不同的是...
2019-12-05 17:50:54
110
原创 插入排序
时间复杂度最好O(n)最坏O(nn)平均O(nn)空间复杂度O(1)代码void insertSort(int a[],int n){ if(n<=1)return; for(int i =1;i<n;++i) { int value = a[i]; int j =i-1; for(;j>=0...
2019-12-04 17:11:00
102
原创 冒泡排序
代码void bubbleSort(int a[],int n){ if(n<=1) return ; bool flag = false; for(int i =0;i<n;++i) { //提前退出冒泡排序循环 flag = false; for(int j =0;j<n-i-1;++j) ...
2019-12-04 15:10:34
114
原创 链表的基本操作
链表的一些基本操作(想到了就写,慢慢更新)#include <iostream>#include<math.h>#include<typeinfo>using namespace std;/*单链表反转链表中环的检测两个有序链表的合并删除链表倒数第n个节点求链表的中间结点*/typedef struct node{ int d...
2019-11-20 15:12:19
121
原创 八皇后问题
一、什么是八皇后问题?八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?二、如何求解?以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第...
2019-11-13 12:48:00
208
原创 时间空间复杂度分析
一、为什么要分析复杂度1、假设我们每次都直接用机器去运行代码来测试代码运行花费的时间,测试的结果很受硬件的影响,比如说i9的CPU和i3的测试结果肯定有很大的差距2、用机器去测试代码的效率很受数据规模的影响,举个极端的例子,几十个数据排序,插入排序可能比快排要快。所以我们要用一个不用具体的测试数据也不依赖于硬件条件的测试方法,来粗略的估算出算法(代码)的执行效率二、如何表示复杂度?T(n...
2019-11-12 01:13:01
207
原创 glTexSubImage2D的使用详解
一、函数介绍void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, ...
2019-11-10 02:27:35
20764
原创 # define的用法
一、宏的定义与撤销1、宏定义时尽量加上括号#include <iostream>#include<math.h>using namespace std;#define T1 3+4 //容易产生歧义#define T2 (4+3)//添加括号后,语义清楚int main(){ int a =1; int b =1; a = 2*T...
2019-11-04 13:25:38
569
原创 C++内联函数
C++内联函数1、什么是内联函数内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为...
2019-11-01 12:26:10
1063
原创 const关键字
const关键字1、const和变量const int a = 3;在编译阶段,编译器就知道 a 这个变量是read-only的,不能被修改。一旦试图修改就会报错const 处于类型前还是类型后没有影响const int a =3;int const a =3;//这两个是一样的2、const和函数参数如果我们不希望传入函数得参数被修改,可以用const#include...
2019-10-29 15:34:08
117
原创 OpenGL中列序储存是什么?以及为什么矩阵乘法顺序要反过来
一、shader中为什么矩阵要反过来乘首先我们写一个单位矩阵1000010000100001\begin{matrix} 1 & 0 & 0 &0 \\ 0 & 1 & 0 &0\\ 0 & 0 & 1 &0\\ 0 & 0 & 0 &1 \end{matrix}10...
2019-10-29 12:02:17
1107
原创 引用和指针的区别
1、指针有自己的一块空间,而引用只是一个别名指针有自己的内存,引用的内存就是引用的对象的对存#include <iostream>using namespace std;int main(){ int data = 1; int* a = &data; int& b = data; cout << "address of a = " <...
2019-10-25 18:29:26
165
原创 auto关键字
C++98auto早在C++98标准中就存在了auto关键字,那时候的作用是让变量变成自动变量,拥有自动的生命周期,但是临时变量在声明的时候本身就是自动生命周期了,所以这显得很多余。int a =10 ; //拥有自动生命期auto int b = 20 ;//拥有自动生命期static int c = 30 ;//延长了生命期取而代之,C++11就删除了原来的用法,改为了自动推导...
2019-10-24 14:58:00
536
原创 C++ 容器的基础知识总结
本文参考总结自(作者:melonstreet链接:https://www.cnblogs.com/QG-whz/p/5152963.html)0、容器概论容器是指用以容纳物料并以壳体为主的基本装置 ,C++的容器就是可以用来储存对象的容器。STL将定义的通用容器分三类:顺序容器,关联容器和容器适配器。顺序容器:array(C++本身内置)、vector、list、forward_li...
2019-10-23 15:48:56
484
原创 new和malloc的区别
参考博客(作者:melonstreet链接:https://www.cnblogs.com/QG-whz/p/5140930.html)1、申请内存的位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的...
2019-10-21 14:42:01
307
原创 射线与AABB型包围盒相交算法
基础知识:AABB包围盒,也叫轴对称包围盒,意思就是它的六个面总是分别平行XYZ三个轴的相交计算原理:计算射线与包围盒每个面的平面的交点,计算这个点是否在包围盒面的范围,在就是相交,不在就是没有相交图解:用个2D图形简单讲解一下首先从图中可以看到射线Ray和红色的包围盒相交了,但是怎么计算出来(毕竟在3D世界中,不可能全靠眼睛去看…)这个包围盒有4个面,2个平行于Y轴,2个平行于X...
2019-10-18 17:52:54
5646
1
原创 法线矩阵
法线矩阵一般在做坐标变换的时候,会将所有顶点全部乘以一个矩阵,转换到对应的坐标系中,但是对于法线使用相同的转换是有问题的,下图解释了为什么会有问题存在也就是法线在做相同变换后,如果变换中包含非等比的缩放(x,y,z不同,等比缩放的话不影响切线),结果法线就已经不再垂直表面了(想象变形后的切线之间角度都变了),需要重新调整,所以使用专门的法线矩阵来转换法线比较靠谱。法线矩阵的一种计算如下:...
2019-10-10 10:48:08
946
原创 VS2017:error LNK2019“无法解析的外部符号”
VS2017编译报错报错信息:LNK2019 无法解析的外部符号_imp_sprintf,该符号在函数_bdf_parse_properties中被引用。在项目属性->链接器->输入里面加入库legacy_stdio_definitions.lib...
2019-09-20 11:37:24
2996
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人