自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 xcode添加第三方库*.dylib

开发的时候需要给xcode添加一个第三方库,我以为是个很简单的事情,没想到折腾了一晚上,这里记录一下流程。### 1. 添加第三方库到工程在build phase里面的link binary with libraries添加我们的第三方库然后build setting里面的header search path 和 library search path 分别配置一下,这样我们的添加工作就完成了。### 2. library not loaded: image not found.

2021-03-05 21:31:45 2721 1

原创 Python学习记录(元类和单例模式)

参考博客个人对元类的理解是修饰类的创建过程,如果不使用自定义元类则是使用type这一元类来默认创建类。

2019-07-10 19:02:18 157

原创 Python学习记录(类的初始化过程和类的三种方法)

类的初始化过程和类的三种方法类的初始化过程类内的三种方法类的初始化过程在执行类的初始化的时候,比如a = A(),先是执行了__new__(cls) 方法,根据传入的cls来分配空间,然后再执行对象的__init__(self) 方法。cls为类,self为类实例,类函数需要传入self,类似于C++里的this指针。类内的三种方法普通的函数,def f(self)静态函数@stati...

2019-07-04 20:08:55 1975

原创 Python学习记录(闭包和装饰器)

主要记录一下每天的学习收获今天看代码的时候发现了在函数里面嵌套函数的做法,不太理解这样做的目的。https://www.zhihu.com/question/25950466看了别人的回答后了解了闭包和装饰器的概念。闭包可以用封存函数执行的上下文,装饰器可以封装函数。还有一些小的地方的收获,比如可以这样写代码:1 and fun()如果true则执行函数...

2019-06-27 22:01:58 138

原创 基于UDP的客户端服务端通信(Python)

客户端(需要预先知道服务端地址,IP地址和端口号)from socket import *servername = 'hostname/ip address' //服务器IP地址或者主机名serverPort = 12000                 //服务器端口号clientSocket = socket(AF_INET, SOCK_DGRAM)        //创建socket...

2018-06-07 19:06:28 509

原创 全排列

找到下一个排列的算法从数组的尾部开始找到第一个非递增的,然后把该数后面的进行翻转。再找到第一个比它大的,交换它们的位置,即为下一个排列。通过它可以找到全排列(无论包不包含重复元素) void nextPermutation(vector<int>& nums) { int n = nums.size(); int i = n - 2; ...

2018-04-15 15:59:03 177 1

原创 寻找数组中只出现一次的数

有三个类似的问题,分别是1、数组中除了一个数只出现一次,其他所有数都成对出现。这个问题的解法是将所有数异或,然后得到的结果就是我们要求的数。2、数组中有两个数只出现一次,其他数都成对出现。解法是先将所有的数进行异或,得到一个中间值。这个值为两个不同数异或的结果。然后找到为1的位,这个位代表这两个数不相同的位。然后根据它与两个数异或,将这两个数分到两个不同的数组里。问题就转化成第一个问题了。然后可以...

2018-04-07 22:53:24 1057 1

原创 用回溯算法解决八皇后问题

八皇后问题是指在一个8乘以8的棋盘上放置八个皇后,它们不能在同一行同一列以及同一对角线上,有多少种放法。解决思路:用二维数组表示棋盘,初始为全0,放置皇后则将值置1。当全部放置好了,就将计数器加1。最后输出计数器。无论成功还是失败,都进行回溯。#include <vector>#include <iostream>using namespace std;//负责放置皇...

2018-03-18 22:54:44 346

原创 IO多路复用并发服务器

服务器调用select函数检测两种不同类型的输入事件 1、新的客户端请求到达,此时监听描述符准备好可以读了 2、一个已存在的客户端的已连接描述符准备好可以读了#include <iostream>#include <unistd.h>#include <sys/socket.h>#include <netdb.h>#include <sys/select.h>ssize_t rio_w

2017-12-19 11:15:15 786 1

原创 搭建web服务器(tiny web)

服务器端 客户端 代码设置的默认路径为桌面,hello.txt文件位于桌面,选择端口的端口号为8000(命令行第二个参数),127.0.0.1代表回送地址,指本地机,需要先行确认可用(本人通过Apache打开)。#include <iostream>#include <unistd.h>#include <cstddef>#include <sys/socket.h>#includ

2017-12-17 22:48:24 1689 1

原创 系统级IO

#include<cstddef>// unixIOssize_t read(int fd, void *buf, size_t n); //若成功则为读的字节数,若EOF则为0,若出错则为-1ssize_t write(int fd, const void *buf, size_t n);//Robust IO//不带缓存版本ssize_t rio_readn(int fd, vo

2017-12-11 15:49:37 178

原创 编写内存分配器

编写一个简单的分配器需要考虑以下问题: 1、空闲块的组织方式,选用的是隐式空闲链表 2、如何放置一个新分配的块,采用的是首次适配策略 3、如何合并空闲块块的格式:使用边界标记的堆块的格式定义4个字节为一个字,头部和脚部各一个字,内容相同。分别为块的大小和块的分配状态。采用双字对齐,因此最小块大小为16字节。脚部是为了便于合并空闲块而存在。堆的格式序言块和结尾块的存在也是为了便于合并。我们的内存

2017-12-08 16:26:11 574 1

原创 数据成员绑定

int x=0;class Foo{public: Foo(){x=0;} void X(int val){x=val;} int X(){return x;}private: int x;};int main(){ Foo b; b.X(3); cout<<x<<endl; cout<<b.X();}上述代码

2017-11-13 22:37:39 198

原创 不同对象的字节表示

#include <cstdio>#include <iostream>typedef unsigned char * bytePointer;void showByte(bytePointer bP,size_t length){ size_t i=0; for(;i<length;++i) { printf("%.2x ",bP[i]); }

2017-10-10 15:00:58 274

原创 文本查询程序再探(C++primer5th)

在文本查询程序的基础上添加了更多功能。 单词查询:查询单词出现的次数(一行出现多次只算一次),并打印出所在的行。 逻辑查询(~,&,|),支持混合使用这些运算符。 通过一个接口类Query隐藏整个实现的继承体系,同时被用户代码和类实现代码使用。这种做法可以将接口与实现分离,Query内存储一个指向实际实现类的指针。首先是文本查询程序中的原代码,只给QueryResult.hpp添加了新的成员函

2017-10-09 18:10:58 875

原创 一个HelloWorld程序的生成过程

生成过程 源程序(文本文件) ->预处理器(处理头文件)(文本文件) ->编译器(生成汇编语言)(文本文件) ->汇编器(生成机器语言)(可重定位目标文件)(二进制文件) ->链接器(合并不同文件)(可执行目标文件)(二进制文件)

2017-10-06 16:22:45 435

原创 swap函数的实现方式

默认版本namespace std{ template<typename T> void swap(T & a,T & b) { T temp(a); a=b; b=temp; }}如果类采用指针存储数据,则默认交换方式会变得低效。因为只用交换两个指针便能实现两个对象的交换。因此需要特化版本的swap,由于指针是私有成

2017-09-21 15:00:31 1848

原创 资源管理类

以对象管理资源,获取资源后立刻放进管理对象。构造函数获取资源,析构函数释放资源。资源管理类中小心copying行为。一般有几种做法: 1、禁止复制,例如输入输出流。 2、对底层资源采用“引用计数法”,可以利用shared_ptr智能指针,可以指定删除器,更改计数为0时的行为。 3、复制底部资源,深拷贝 4、转移底部资源的所有权,只有一个对象指向资源

2017-09-18 21:51:50 411

原创 指针和const

1、指向常量的指针,这个类似于常量引用。不能用其改变所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。指向常量的指针并没有要求所指对象必须是常量,只是要求不能通过该指针改变对象的值。关于这点可以类比常量引用。 const double pi=3.14; const double *cptr=π double dval=3.14; cptr=&dval;2

2017-09-13 22:33:57 163

原创 配对堆

配对堆采用左儿子和右兄弟的表示方法。存在额外的链,如果节点是最左儿子,则链指向父节点,如果不是,则指向左兄弟。把这个数据成员叫做prev。 配对堆的基本操作有merge、insert、deleteMin、decreaseKey。合并时让较大根的子堆成为另一个最左的儿子。如下图所示: insert操作返回Position对象,传给decreaseKey操作使用。insert操作是mer

2017-09-13 16:42:58 1317

原创 利用unity实现简单的贪吃蛇游戏

首先创建一个头部,编写脚本利用WASD控制头部的移动。 Vector3 up=new Vector3(0,1,0); Vector3 down=new Vector3(0,-1,0); Vector3 left=new Vector3(-1,0,0); Vector3 right=new Vector3(1,0,0); Vector3 now;//头部实际前进方

2017-09-12 15:52:23 3011 1

原创 Treap树

Treap树的节点具有优先级,优先级是在建立节点时随机指定的。Treap树是节点优先级满足堆序的二叉查找树:任意节点的优先级至少和它的父节点的优先级一样大。根节点优先级最低。nullNode节点优先级为无穷。头文件#include <climits>#include "UniformRandom.hpp"template <typename Comparable>class Treap{p

2017-09-08 21:10:47 286

原创 红黑树--自顶向下插入

红黑树是具有下列着色性质的二叉查找树: 1、每一个节点红或者黑 2、根是黑色的 3、如果一个节点是红色的,那么它的子节点必须是黑色的 4、从一个节点到一个null指针的每一条路径必须包含相同数目的黑色节点在执行插入操作时,如果父节点为黑节点则直接插入红节点。但如果父节点是红节点,如果插入黑节点则会违反法则4,黑色节点数目变多。如果插入红节点则会违反法则3,出现连续的红节点。因此采用旋转操作和

2017-09-07 16:08:54 619

原创 三连游戏优化--α-β裁剪

findCompMove操作希望得到返回值中的极大值,而findHumanMove操作返回极小值。将findCompMove操作得到的尝试性的极大值(α)传给findHumanMove,如果findHumanMove尝试性的极小值(β)小于这个极大值,则立马返回,无需尝试后面的情况。此为α裁剪,对称情况即为β裁剪。尝试性的意思是指目前已经得到的极大值或者极小值。α-β裁剪能显著的改进搜索的范围。代码

2017-09-06 16:19:11 337

原创 回溯算法--三连游戏(人机对战)

程序的核心部分在于计算机如何选择下棋的位置。采用的策略叫作极小极大策略。通过一个赋值函数来给一个位置的“好坏”定值。能使计算机获胜的位置得到值+1;平局得到0;使计算机输棋的位置得到值-1。通过考察盘面就能够确定输赢的位置叫作终端位置。  如果一个位置不是终端位置,那么该位置的值通过递归假设双方最优棋步而确定。这叫做极小极大策略,因为下棋的一方(人)试图极小化这个位置的值,而另一方(计算机)却要使它

2017-08-24 16:47:14 533

原创 回溯算法--收费公路重建问题

通过点与点之间的距离重新构造出点集。距离集大小为N(N-1)/2,N为点的个数。驱动程序#include <iostream>#include <vector>#include <set>using namespace std;bool turnpike(vector<int> & x,multiset<int> d,int n){ bool place(vector<int> &

2017-08-21 18:47:21 768

原创 测试一个大数是否是素数

如果P是素数,且0int witness(const int & a,const int & i,const int & n){ if(i==0) return 1; int x=witness(a,i/2,n); if(x==0) return 0; int y=(x*x)%n; if(y==1&&x!=1&&x!=n-1)

2017-08-20 20:49:51 353

原创 随机数生成器

头文件static const int A=48271;static const int M=2147483647;static const int Q=M/A;static const int R=M%A;//x[i+1]=Ax[i]modMclass Random{public: explicit Random(int initialValue=1);//x[0]种子

2017-08-19 21:31:20 1173

原创 动态规划—矩阵乘法排序

矩阵乘法满足结合律,因此可以选择不同的乘法顺序来进行。矩阵乘法进行的次数等于两个子序列各自乘法次数加上两个子序列做一次乘法所需次数。 Mleft,right=Mleft,i+Mi+1,right+cleftcicrightM为乘法次数,c[i]等于第i个矩阵的列数。c[0]为第一个矩阵的行数,c[i-1]为第i个矩阵的行数 由于递归在一些情况下会重复计算,导致效率急剧降低,因此需要将递归变为非递

2017-08-18 18:31:37 514

原创 深度优先搜索寻找割点

如果无向连通图不存在删除后剩下的图不再连通的顶点,则该图为双连通。如果不是双连通的图,那么那些删除后剩下的图不再连通的顶点叫做割点。 执行深度优先搜索,按照搜索顺序给顶点编号Num。然后后序遍历,计算顶点的Low值,其为顶点通过该序(可能包含背向边)能到达的最小顶点。 Low(v)为各项中的最小值: 1、Num(v) 2、所有背向边(v,w)中的最低Num(w) 3、所有边(v,w)中的最

2017-08-14 21:07:44 1153

原创 Dijkstra算法那--赋权最短路径

相对于无权最短路径,赋权最短路径多了一个成员know来标记顶点是否已知。从未知的顶点中找到路径最短的顶点,标记为已知,然后如果它的未知邻接顶点距离dw大于dv+Cv,w,则更新dw。头文件#include <vector>#include <map>#include <iostream>static const int MAX=10000;using namespace std;class

2017-08-11 17:17:58 727

原创 词梯游戏

//无权最短路径问题#include <iostream>#include <unordered_map>#include <string>#include <vector>#include <queue>using namespace std;unordered_map<string,string>findChain(const unordered_map<string, vecto

2017-08-07 21:52:32 762

原创 生成迷宫并找出走出迷宫的路径

利用不相交集类生成迷宫,具体见 http://blog.csdn.net/blubluhao/article/details/76445377然后利用无权图的最短路径选择找出走出迷宫的路径,具体见 http://blog.csdn.net/blubluhao/article/details/76726887首先生成迷宫,然后利用已经生成的迷宫构建出一个图。迷宫的所有单元构成图的顶点,单元间没有墙

2017-08-06 21:17:18 1674

原创 无权最短路径选择

图类的数据成员除了顶点的集合外还有一个记录起始顶点的数据成员。顶点的数据成员有距离起始顶点的最短距离,邻接表,最短路径上顶点的上一个顶点三个数据成员。首先将起始顶点入队,距离为零,然后将其出队,更新其邻接顶点的距离并把它们放入队列。重复到队列为空为止。头文件#include <vector>#include <climits>#include <iostream>class Graph{pu

2017-08-05 17:15:07 594

原创 拓扑排序

拓扑排序是针对有向无圈图的顶点的的一种排序。每个顶点拥有入度,邻接表,拓扑序三个成员。首先找到入度为零的顶点将其放入队列,然后将其出队,删除顶点和它的边。然后更新邻接顶点的入度,如果入度为零,则将顶点放入队列,直到队列为空。最后输出拓扑序。头文件#include <vector>class Graph{public: explicit Graph(int vertexNum):v(ver

2017-08-05 15:04:33 244

原创 应用不相交集类生成迷宫

应用不相交集类(采用高度求并和路径压缩查找)构建一个n阶正方形迷宫,迷宫拥有n的平方个单元,每个单元拥有三个数据成员。一个数据成员存储父节点,如果是根节点则存储树的高度的负值减一。另两个数据成员分别代表单元的下侧墙和单元的右侧墙。再额外添加上边框和左边框就构成迷宫。 一开始所有的单元相互不连通,构建时随机选择一堵可以拆的墙,如果墙两侧的单元不连通,联通他们并拆掉墙。如果联通就不进行操作。进行到最后

2017-07-31 15:41:41 904

原创 不相交集类

union采用按高度求并,find采用路径压缩。存储的高度值为实际高度的负值减一。#include <vector>using namespace std;class DisjSets{public: explicit DisjSets(int numElements); int find(int x)const; int find(int x); void u

2017-07-30 10:30:29 294

原创 可变长度的基数排序

字符串的比较是从高有效位开始依次比较,和长度没有太大关系。因此可以理解为末尾补零,长度相同。先将字符串按长度进行排序,然后从低有效位开始比较,对零(没有的位)不进行处理(已经在正确的位置)。#include <iostream>#include <vector>#include <string>using namespace std;void radixSort(vector<string>

2017-07-28 22:09:30 323

原创 桶排序与基数排序与计数基数排序

输入只有大小小于M的正整数,可以采用桶式排序。#include <iostream>#include <vector>#include <string>using namespace std;//基数排序void radixSort(vector<string> & arr,int stringLen){ const int BUCKETS=256; vector<vec

2017-07-28 20:40:40 236

原创 快速选择

快速选择和快速排序类似,将数组分为S1和S2。当K值小于S1的的长度时,对S1进行递归。当k值刚好等于pivot时,那么已经找到了。当k值大于S1长度加一时,对S2进行递归。最后K始终在数组下标k-1的位置。#include <iostream>#include <vector>using namespace std;template <typename Comparable>void ins

2017-07-25 10:13:14 173

空空如也

空空如也

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

TA关注的人

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