模板优先级队列及堆排序(C++实现)

模板优先级队列,数组实现,再熟悉一下常用算法,同时简单的堆排序应用 写了一个是队列自增长,另一个为了演示我还添加了一个叫做FillPq的方法,这个方法可以使用一个数组直接填充到优先级队列里,此时,优先级队列并不优先,然后进行下滤调整,之后建堆完成,输出即可 然后是堆排序  

模板栈以及中缀表达式求值(C++实现)

栈直接用链表实现,这个比较简单,不多说,不过C++写程序,IDE的错误检测不是很给力。 至于给定一个中缀表达式,如何不转换成后缀表达式,直接求值,方法就是使用两个栈,一个操作符栈,一个操作数栈,然后从左到右扫描表达式,我这里中缀表达式计算实现的很简单,不完整,大家可以扩展。栈的实现是我想写的,思路如下: 1.如何是操作数,压入操作数栈 2.如果是操作符,压入操作符栈 3.如果是左括号,直接忽略 4.如果是有括号,弹出操作符栈栈顶元素,然后弹出操作数栈两个元素,进行操作以后结果压入操作数栈  看个图就好了  最后给出栈顶实现代码 然后是main函数代码 另外,今天是博客建站一周年.加油!

并查集(C++实现)

并查集这个很有意思,并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。昨天看书看到了,然后用C++简单实现了下。在Dijkstra算法中,用来判断两个顶点是否在同一个集合里。 里面定义了两个类,都是并查集,一个是QuickFind,查找很快,一个是QuickUnion,合并较快。写了一些注释,有一些优化的提示.看代码吧,有什么问题指出来吧。 QuickFind的实现 QuickUnion的实现 参考文档(英文):UnionFind.pdf 工程代码下载:并查集Demo

和 浅析

这两个转义字符最初学习C++的时候看到了,当时没多想,后来某一天突然想起来,回车不就是换行吗?这不是多此一举吗?今天又看到,索性查了下相关资料,整理一下,留作记录. 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行(这句的意思是把纸向上拉,然后打印头就定位到了下一行),可以想象一下,这个打印头只能在一个固定的水平线上左右移动,而不能上下移动,我们通过移动纸来完成打印下一行。 不明白的我在youtube上找到一个这种打字机的演示视频,为了方便读者观看,我提供一个下载地址。 后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。 Unix系统里,每行结尾只有”<换行>",即”\n”; Windows系统里面,每行结尾是”<换行><回车>",即”\n\r”; Mac系统里,每行结尾是”<回车>",不过mac基于unix,所以换行也应该是可以的。 一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。这个如果你在windows下使用vim也会发现这个情况 用C++来说明 如:  最后只显示 bystander 而 leaver.me 背覆盖了 \n 是换行,系统会将其替换成回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉 则 显示 leaver.me bystander 一句话,这看起来是一个历史遗留问题……

[藏]关于B树的一篇文章

很多人对B树的理解有很多错误,我看的最多的就是有人混淆二叉树(Binary Tree)和B树(B-Tree),二叉树是不用简称,也就是BT的,而特殊一点的二叉搜索树才会用BST(Binary Search Tree),至于B-树和B树,这两个其实一样的,英文都是(B-Tree),注意看中间的-号,这个是国内翻译的问题.所以大家不要被误导. Rudolf Bayer 和 Ed McCreight 于1972年,在Boeing Research Labs 工作时发明了B 树,但是他们没有解释B 代表什么意义(如果有的话).Douglas Comer 解释说: 两位作者从来都没解释过B树的原始意义。我个人觉得很有可能是他的名字,程序员对其作品的一种情结吧. 这篇文章来自国外,是某大学的CS课程在线的,由于有时候无法访问,我直接提供PDF版,对其构造过程非常清晰.非常非常好的B树教程,图示很多,就不翻译了,强烈推荐阅读!  下载:B树讲解  

[藏]熬就一个字

文/冯仑 男孩子最大的问题,30多岁自己还没有成功。 现在社会反差特别大,怎么坚守自己的人生目标就特别难,随波逐流总是成本低,但对自己不负责任,不如设定一个特别大的目标,然后熬,一直熬下去。 熬是个什么概念? 20多岁刚毕业,你是社会的边缘,什么事都是哥哥、姐姐、30多40多的人在做,你得求这些人;等到30多岁,你开始进入到剧场最后一排,有了一张门票可以看别人演;到40、50岁,就是中排靠前一点的观众,看戏你就可以看的清楚了;你如果要出类拔萃就变成第一排了,再出类拔萃你就成演员了,等到你演完了,别人一鼓掌你也就该下场了。 20多岁一定要有一个准备,你就是边缘,边缘是尽快拿到入场券。比如说你到了公司,有了一个稳定的职业,或者一个基本稳定的生活,但是你乘自行车、赶公共汽车,这就是入场券,很正常。 我研究生刚毕业,中间工作八年,每天骑自行车赶到374,然后坐公共汽车,公共汽车下来再走一站地。回头想来不委屈,20多岁肯定是这个过程,如果20岁就跟50岁人一样,那这个戏就乱了,中国十几亿人都这么演的。插队是偶然性,比如像丁磊他是另外一种人生,这种概率极小极小,你可以朝着奋斗。 成功不是设计出来,是靠信念支撑,加上各种机遇偶然蹦出来了。当你成演员,基本上也该谢幕了,接下来又来了人,这个戏才能不断唱。现在70多岁人基本上又退回到场外了,看他儿子演孙子演,就这么一茬一茬。 熬要有耐心,熬不是你一个人熬,而是一代人熬。

[E].Net 多线程指南

这是codeproject上的一个系列。我看完了。收获匪浅。可惜作者之后未能更新预想中的总结贴,多少有些可惜,不过。此系列非常非常不错。建议想学习.net多线程的看看。 1.net 多线程介绍 Introduction into threading in .NET 2.线程周期/线程优势/陷阱 Lifecycle of threads/Threading opportunities/Traps  3.线程同步 Synchronization 4.线程池 Thread Pools 5.UI中的线程应用 Threading in UIs (WinForms / WPF / Silverlight)

详细讲解双查询注入

上一篇文章中,http://leaver.me/archives/2726.html 我说双查询很难讲清楚,这次就试着讲一下。读了一些原理性的东西。然后尽量通俗的给大家讲清楚。。 在此之前,我们理解一下子查询,查询的关键字是select,这个大家都知道。子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。 看一个简单的例子: 真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。 原理: 双注入查询需要理解四个函数/语句 1. Rand() //随机函数 2. Floor() //取整函数 3. Count() //汇总函数 4. Group by clause //分组语句 简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。 以本地一个名为Security的数据库为例 首先在bt5下的命令行下输入 就会连接上数据库了。 然后通过use security; 就可以切换到security数据库了。因为一个服务器上可能有多个数据库嘛。 然后我们执行一下前面那个简单的子查询的例子 就能显示security,也就是显示了当前数据库的名字了。 然后我们测试一下concat的用法。输入 显然结果就是string1string2了 然后我们测试一下rand()这个随机函数是干嘛的 我们多执行几次 可以看到,这个函数就是返回大于0,小于1之间的数 然后看看取整函数 这个函数就是返回小于等于你输入的数的整数。 然后我们看看双注入查询中的一个简单组合。大家从我的上一篇文章中应该也看到了有一个子查询是 我们从里向外看。rand() 返回大于0小于1的小数,乘以2之后就成了小于0小于2了。然后对结果进行取证。就只能是0或1了。也就是这个查询的结果不是1,就是0 我们稍微加大一点难度。看这个查询 不要怕。先看最里面的SELECT database() 这个就返回数据库名,这里就是security了。然后FLOOR(RAND()*2)这个上面说过了。不是0,就是1.然后把这两个的结果进行concat连接,那么结果不是security0就是security1了。 如果我们把这条语句后面加上from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录,这里users表里有13个用户,所以返回了13条 如果是从information_schema.schemata里,这个表里包含了mysql的所有数据库名。这里本机有三个数据库。所以会返回三个结果 现在我们准备加上Group By 语句了。 我们使用information_schema.tables 或 information_schema.columns者两个表来查询。因为表里面一般数据很多。容易生成很多的随机值,不至于全部是security0,这样就不能查询出结果了。 这里我先解释一下。我们把concat((select database()), floor(rand()*2)) 这个结果取了一个别名 a ,然后使用他进行分组。这样相同的security0分到一组,security1分到一组。就剩下两个结果了。 注意。这里的database()可以替换成任何你想查的函数,比如version(), user(), datadir()或者其他的查询。比如查表啊。查列啊。原理都是一样的。 最后的亮点来了。。 我们输入这条:注意多了一个聚合函数count(*) 报错了 重复的键值 可以看到security就是我们的查询结果了 想要查询版本就这样: 看看替换了database()为version() 再看一个 报错 这里的~这个符号只是为了让结果更清晰。 这里还有一个比较复杂的。叫做派生表。需要使用 select 1 from (table name); 这样的语法来报错,具体就是 来报错。 大家可以对照我上一篇文章来看。相信讲的还算清楚。

C#中的Debug类

位于命名空间System.Diagnostics中 1.Debug.Print方法 2.Debug.WriteLine方法 3.TraceListener类 DelimitedListTraceListener创建的时候指定一个文件名,当Flush调用的时候,就被覆写到文件里。 第一个参数一个bool值,为真则输出。 5.Debug.Assert方法 如果表达式为false,则输出。

消费者行为学

今天一直在自习。。中午遇到了初中同桌。。5年没见了吧。聊了一会。被各种叮嘱“一定不要找太娇生惯养的,太粘人的,太无理取闹的。要听我的话,不然受苦的可是你。”哈哈。当时笑喷了。谢谢同桌。好好工作吧。  这本书是寒假在家看的一本书。一点点笔记。  选择喜爱的网站在很大程度上是一种生活方式的声明,它说明了一个人的兴趣和他想成为哪一类型的人,人们选择一种产品。通常是因为他们喜欢他的个性,觉得和自己比较温和。甚至有些人认为,使用产品后,他所拥有的令人渴望的品质会转移到自己身上。  每一年,人们都会购买大量几乎没有任何味道,没有任何营养的食品,这说明现代消费者行为学领域的一个基本前提是,人们购买产品往往并非因为他们能做什么,而是因为他们意味着什么。在其相同的情况下,人们会选择那些具有与其潜在需求一致的形象/个性的品牌。  营销者与消费者共处于一种复杂的双向关系中,往往很难判断营销活动是在哪里结束,而“真实世界”又在哪里开始,这种界限的模糊带来一个结果,那就是我们不再确定(或者也不在意)区分虚构世界和现实的界限究竟在哪里。有时候,我们呢愉快地加入到这个幻想中。  商业道德是引导市场行为的原则。包括诚实,可信赖,公平,尊重,正义。消费者认为行为道德的公司制造的产品评价较高。  品牌是在消费者头脑中设立的账户,也许巨额投入的营销策略只可以提高一个品牌的小小美誉度,而一次不大的产品质量危机则可能会一夜之间让该品牌资产荡然无存。  需求是一种基本的生物动机,欲望是社会教给我们的可用以满意需求的一种方式,比如口渴是生物意义上的,而我们被教会用可口可乐而不是(比如)羊奶来满足解渴的需要,因此,需求是本来就已经存在的。营销者只是推荐满足他的方法。营销的一个基本目标就是引起人们认识到需要的存在,而不是创造需求。  广告人对于人们的了解还远远未达到操纵他们的程度,新产品的失败率从40-80%,尽管人们认为神奇手段和科学技术在操纵他们,而事实上。只有设法销售优秀产品时才会成功。  绿色营销越来越普遍。强迫性消费是指反复的而且常是过度的购物行为,他被当作压力/焦虑/沮丧/无聊的宣泄渠道。和毒品类似。女性观有强迫购物失常的概率是男性的4倍,女性被服装和化妆品吸引,男性则被小配件,工具,枪支等吸引。