自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 问答 (1)
  • 收藏
  • 关注

原创 Apache beam其他学习记录

Combine与GroupByKeyGroupByKey是把相关key的元素聚合到一起,通常是形成一个Iterable的value,如:cat, [1,5,9]dog, [5,2]and, [1,2,6]Combine是对聚合后的Iterable进行处理(如求和,求均值),返回一个结果。内置的Combine.perKey()方法其实是GroupByKey和Combine的结合,

2017-09-15 21:00:41 414

原创 Apache Beam的分窗与触发器

本文参考Apache Beam官方编程手册在默认情况下,Apache Beam是不分窗的,也就是采用GlobalWindow,而如果同时也不设置自定义的触发器,那么Beam会在所有数据都收集到之后才开始对数据进行处理。这通常只能适用于有限数据且对实时性要求不高的情况。当输入为无限流数据,我们可以1)设置合适的窗口大小(根据时间戳),在窗口末端进行数据处理;2)设置触发器,当条件满足时触

2017-09-14 20:07:31 1138

原创 Apache Beam中的几种常见的处理类

要说在Apache Beam中常见的函数是哪一个,当然是apply()。常见的写法如下: [Final Output PCollection] = [Initial Input PCollection].apply([First Transform]) .apply([Second Transform])

2017-09-10 23:41:38 990

原创 C++中4种类型转换

先看下c和cpp类型转换的区别:C风格和函数风格的显式转换视情况由下面第一个匹配的C++风格显式转换构成:— a const_cast,— a static_cast,— a static_cast followed by a const_cast,— a reinterpret_cast or— a reinterpret_cast followed by a c

2016-03-20 15:12:44 1124

原创 构造函数中调用虚函数?

面试常见题。事实上在语法上是没有问题的,编译可以通过。问题在于构造函数中调用虚函数无法实现多态。看下面的代码:class A{public: A() { show(); }//行4 virtual void show() { cout << "A"; } void anotherShow(){show();}//行6};class B:public A{public

2016-03-19 19:22:54 3454

原创 C++11新特性move

首先要明白左值和右值的概念。最简单的理解就是等号的左边和右边,但是这个理解并不十分准确。左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以作为一个左值。它必须是一个变量,或是一个解引用的指针。右值指的是引用了一个存储在某个内存地址里的数据。从上面的两个定义可以看出,左值其实要引用一个对象,而一个对象在我们的程序中又肯定有一个

2016-03-09 20:01:22 2311

原创 关于线程和进程的一些小结

一、线程和进程的区别1.每个程序至少有一个进程,每个进程至少有一个线程。2.进程之间的内存空间是独立的,而同一个进程的线程之间的内存是共享的。所以线程切换更快。二、进程间通信1.管道,包括无名管道(父子线程之间),有名管道(任意两个线程,半双工)2.内存共享3.套接字三、死锁在内存共享的时候,为了避免出现多个进程(线程)同时写的情况,需要对读写进行同

2016-03-07 11:41:35 305

原创 TCP的三次握手和四次挥手

面试季到了,各种恶补中...一、三次握手1.客户端发出请求,同步位syn=1, 确认位ack=0,同时产生一个随机序列A;2.服务器收到上述请求后,做出回应,syn=1,ack=1,同时发回确认序列A+1,以及一个随机序列B;3.客户端收到响应后确认收到的ack=1,确认序列=A+1,开始发送ack=1,同时回应确认序列B+1;3.1服务器收到响应,确认ack=1,确认序列=B

2016-03-05 11:11:19 326

原创 散列表(拉链式和线性探测)

无论是顺序查找还是二分查找(包括二叉树),查找或插入的时间复杂度总会与数据的总数N有关,而散列表可以将查找和插入操作降低到常数级别。最简单的一种常数级别的符号表,就是直接将数据的键值作为数组的索引,通过键值就可以立即访问到数据,时间复杂度为1.但是这种方法有一个缺点就是键值的分布并不是平均的,而且跨度可能会很大,这样就会导致数组中很多空间被浪费了。而散列表就是解决了这个缺点,将键值映射到均

2016-01-05 19:04:37 818

原创 二叉查找树(BST)的实现

二叉查找树是一种非常重要的结构,它解决了链表查找慢,数组插入慢的问题,将查找和插入都降低到 lgN数量级。本文主要参考了《算法(第4版)》里的思想,用C++进行实现。1.节点结构class treeNode{public : treeNode(int key, int val, treeNode* left, treeNode* right); treeNode(int key

2015-12-29 16:31:04 391

原创 关于默认构造函数的一点总结

我们定义一个简单的类:class func{public: int a; int b;};1.假如我们不写构造函数,那么: func obj();//编译器会误认为是一个函数的声明 func obj2;//编译通过,但是对象未初始化 func* obj3=new func();//会调用系统生成的默认构造函数 func* obj4=new func; cout<<"

2015-12-19 17:51:07 1422

原创 优先队列和索引优先队

用堆二叉树实现,参考《算法》(第四版)。1.优先队列//二叉堆,从小到大排序class heapBinaryTree{public: heapBinaryTree(int capacity);//指定容量 heapBinaryTree(const int num[], int len);//用数组初始化堆 ~heapBinaryTree(); inline int getCa

2015-12-16 20:45:39 1119

原创 堆排序

思想:将数组调整为一个堆,保证父节点不小于两个子节点,这样根节点(堆顶)就是所有元素中的最大值。不断取出根节点并重新调整堆,直到堆被取完即可完成排序。技巧:1.关于“不断取出根节点形成有序数组”,可以将堆顶(最大值)与堆的最后一个节点交换,然后缩小堆(排除已取出的节点),然后下沉堆顶到正确的位置即可得到新的已调整的堆;2.构造堆有两种方式,一种是从堆顶往后遍历所有节点,每次都将当前节点

2015-12-10 18:49:28 332

原创 链表的快速排序

感觉链表的快速排序也挺好写的,甚至比数组更容易理解,但不知道为什么看到很多人都说快排不适合单链表结构的数据。思想:取第一个元素为哨兵,遍历链表,将小于、等于、大于的元素分成3个子链表;递归整理“小于”链表;递归整理“大于”链表;将3个链表连接起来。代码实现如下://链表快速排序,返回最后一个元素的地址myNode* quickSortForList(myNode* &he

2015-11-28 21:10:05 1831

原创 快速排序

使用最广泛的排序算法不需要借助辅助空间,平均复杂度只有NlgN,虽然最坏的情况下需要N平方,但是如果先对序列做随机化处理,出现最坏情况的几率非常小,可以不予考虑。大部分情况下比归并排序效率要高很多,而不需要额外空间。思想:1.随机取一个数,遍历序列,把小于该数的值放在左边,大于该数的放在右边;2.对该数的左边序列进行排序(递归)3.对该数的右边序列进行排序(递归)从上面

2015-11-26 19:14:18 304

原创 为什么归并排序比插入排序比较次数要少?

这两天看了几个排序算法,一直在思考一个问题,为什么归并排序就会比插入排序等初级排序算法的复杂度小呢?因为归并排序每次都把元素往正确的方向移动?还是有比较“记忆”,前面的比较优化了后面的比较?百思不得其解。后来用4个数进行模拟,有了一个猜想,只是猜想,并未验证。假如有ABCD 4个数的序列,要进行升序排序。对于插入排序,最坏的情况就是A>B>C>D,这样要比较次数为6次,排序过程如下

2015-11-24 11:26:03 1429

原创 数组的归并排序

思想:不断二分长序列,直到子序列的长度为1(1个数本身是有序序列),将2个子序列合并,得到一个有序的父序列,继续合并,最终得到一个有序的原序列。实现代码:void mergeSort1(int num[], int start, int end)//自顶向下的归并排序{ //如果序列长度小于5则用插入法 if((end-start)<5) { insertSort(num,

2015-11-23 19:40:37 587

原创 链表的归并排序

一开始写链表的排序代码是因为在《算法》里面看到说自低向上的归并算法比较适合链表结构的数据,但是里面没有给出代码,于是就自己拿来练手。链表排序与数组排序最大的不同就是随机访问代价太高,每次都需要遍历。归并的思想就是把大的数据分成小数据,先将小数据排序,然后再并起来。而自低向上的归并,是一变二,二变四...最终变成一个整体(具体请参考算法书)对于链表来说,两个小链表的合并与两个数组的合

2015-11-22 20:07:38 358

原创 A*算法小结

这两天写cocos2dx寻路的时候刚好看到这个算法,一开始是看的这篇文章:A星寻路算法介绍写得已经是很通俗了,可是其中// if its already in the open listelse { // test if using the current G score make the aSquare F score lower, if yes update the

2015-11-14 20:57:14 445

原创 数组作为函数形参的一点总结

记得以前学C的时候总是会把这个知识点搞混,形参不知道怎么写,今天做个小结。关于int a[]这不是一个数组的声明,因为没有指定数组的大小,但是有两种情况会出现这种写法。(1)int a[]={1, 2};这个写法等价于 int a[2]={1,2}; 系统会自动计算大小。(2)在形参时,如void func(int a[]);这个写法等价于void func(int

2015-11-09 23:14:17 1108

原创 关于洗牌算法的一点总结

之前写斗地主的时候简单写了一个洗牌函数,基本思路是先产生一个顺序数组,遍历数组,每次产生一个(1~n)随机数,把这个随机数作为下标取出数组里的数与当前位置的数交换。当时也没多想,反正能打乱数组顺序就行,后来跟师兄吃饭的时候聊起来,说到面试里也出现过洗牌算法,问我怎么保证这个算法得到的数组是完全随机的(即等概),我一时竟不知怎么证明。回来后上网找了一下,才发现原来这个算法竟然不是完全随机的。

2015-11-08 10:31:15 3599

原创 关于多重继承和虚拟继承

这两个概念在C++的书里面似乎也很少提及,所以看到这两个名词的时候我也往往自动忽略,今天有时间上网百度了一下,找到三篇写得不错的文章:《详解多重继承》《关于C++中的虚拟继承的一些总结》《详解C++虚拟继承》多重继承很好理解,后两篇是讲虚拟继承的,前一篇写的比较浅,看完基本能够理解这个概念,后一篇写的很详细,读起来不太好理解,自己动手写了代码在VC上跑了一下。总的来说就是:

2015-11-02 14:45:24 681

原创 《Essential C++》读书笔记

最近想复习一下C++的知识,刚好实验室有一本《Essential C++》,页数比较平易近人,花了两天过了一遍,做了一些笔记。个人觉得里面举得代码不够浅显(很多都是符号重构),让人没有想看的欲望,

2015-10-29 20:47:56 2197

原创 cocos2dx在VS下Label中文显示乱码…

主要是编码问题,可以将中文字符串放在一个独立的utf-8文件中,然后在程序中读取。如:将上面的代码用记事本保存为utf-8的xml文件。在程序中读取: auto strDic=Dictionary::createWithContentsOfFile("cnString.xml");auto str=((String*)strDic->objectForKey("type1

2015-10-20 15:22:40 718

原创 关于cocos2dx3.X版本的触摸响应的…

相比2.X版本,触摸响应的处理方式差别还挺大的。之前2.x的写法是:先在Layer中打开触摸开关(setTouchEnabled(true)),然后重写registerWithTouchDispatcher()以及3个触摸处理函数。2.x的方法很简单,而3.x则要复杂一些,刚接触时还真有点不习惯。如下:1. 定义一个事件倾听器 auto sprListener=Event

2015-10-20 15:22:38 2394

原创 关于TileMap(瓦片地图)

1.加载地图,获取背景层,调整背景位置,获取其他对象 //获取地图 map=CCTMXTiledMap::create("tilemap1.tmx"); //设置地图背景层的位置 auto background=map->layerNamed("bg"); background->setAnchorPoint(ccp(0.5,0.5)); background->setPosit

2015-10-20 15:22:35 4489

原创 关于COCOS2d里CCArray使用时的一点…

今天在安装网上的教程写塔防小游戏的时候遇到一点问题,原文中是用cocos3.X的代码写的,而由于我用的是2.X(破电脑编译3.X速度实在难以忍受),所以很多小地方都需要修改。其中有一个3.X新加的Vector(Node*)类型,我在2.X里找不到对应的类型,以为跟std::vector(CCNode*)应该差不多,所以就直接替代着用了,编译倒是没有报错,可是每次一运行就GG了。后来发现原来是

2015-10-20 15:22:33 571

原创 为你的ToDoList添加数据保存功能

相信学习IOS的都是从ToDoList开始的吧,官方教程里实现了ToDoList的基本功能,但是数据无法保存,一旦退出后重新进入程序后数据就会丢失,现在给ToDoList添加记忆功能。要用到的知识:1.数据保存2.沙盒概念3.消息发送数据保存和沙盒概念在我的上一篇博文已经提到。就是IOS为了安全起见不允许用户随意地写入数据,你没有权限在程序所在的目录写入数据,而只能在官方规定的目录保存

2015-10-20 15:22:30 1258

原创 在ios下保存数据到plist

今晚想把之前新手教程里的ToDoList拿出来,添加退出保存数据的功能,本来以为只需要简单地调用一个写数据函数就可以搞定,没想到竟然也折腾了好久。用NSDictionary的writeToFile方法一直保存不成功。代码非常简单,就只有几行:     NSDictionary *fileData=@{@"name":@"joe", @"gender":@"male", @"age"

2015-10-20 15:22:27 1375

原创 Objective-C学习笔记3

1,对象初始化-(id)init{ if(self=[super init])//父类初始化 { //子类成员初始化 } return self;}以上是常见的对象初始化代码,[superinit]是调用父类的初始化函数对父类继承下来的内容进行初始化,然后更新self(将重新分配后的内存地址赋给self),通常来说调用[super

2015-10-20 15:22:24 285

原创 Objective-C学习笔记2

1,[class new]和[[class alloc]init]:这两种初始化方式基本没有区别,只不过后者显示地调用init方法来初始化,也可以将init换成其他的方法,比如NSString中的initWithFormat。以下是new的定义:+ new{id newObject = (*_alloc)((Class)self, 0);Class metaClass =

2015-10-20 15:22:22 330

原创 Objective-C学习笔记1

这几篇笔记是读《objective-C基础教程(LearnObjective-C on the Mac For OS X andIOS)》(第二版)做的笔记。主要是一些读书时遇到的疑惑,都是自己的理解,不一定正确,纪录下来方便以后查阅,内容比较基础,对刚入门IOS的朋友也许有些帮助。1,关于BOOL类型:书第14页(P14),方框里的说明中举了一个例子,当把整数8960赋给BOOL类型

2015-10-20 15:22:19 467

空空如也

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

TA关注的人

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