代码改变世界

库恩塔克条件

2012-10-19 22:59 by ggzwtj, 6239 阅读, 1 推荐, 收藏, 编辑
摘要:如下的数学模型称为数学规划:首先,看约束条件H,如果x发生任何微小的变化就会引起该约束的崩溃,所以H在任何时刻都是有效的。G则可以分成两部分:和=,=的情况和H相同,是有效约束,而对于的情况,只要x的变化足够小就可以保证该约束不会被破坏,所以这个约束是无效的。将g泰勒级数展开得到:那么只要,那么只要保证在任意的可行方向D上都有:那么只要足够小就可以保证在可行集中。同理,在可行集中只要存在:那么就能找到更小的f值,也就是说不是极值点。那么进一步也就知道了,在:不存在D使得上面两个条件同时存在的时候,那么在存在极值。现在开始考虑如何求出极值,两种情况:在可行区域内部;在可行区域边缘;对于第一种情况 阅读全文

单词排序

2012-10-08 19:18 by ggzwtj, 1912 阅读, 0 推荐, 收藏, 编辑
摘要:这个是内网的一个编程比赛,我最终没有取得成绩,但还是学了不少的东西,还是在这里写一下大家的思路吧,欢迎讨论。第一种做法:暴力排序 很显然,最简单的方法就是单线程将文件读入,然后排序。 因为字符串比较的时候效率不是很高,所以耗时还是比较长的,下面开始优化。第二种做法:桶排序 第一种做法的效率不高的原因,不只是因为单线程。试想一下,随着排序的进行整体上都逐渐地变得有序,那么如果再比较相邻两个位置的单词的时候就会逐个地比较每个字母。而且再细想一下,这些字母在之前的过程中已经过了,所以就可以考虑桶排序了,每个字母都只会被比较一次。这样效率有一点提升了。第三种做法:压缩字母的桶排序 在第二种做法... 阅读全文

Trie树遍历的加速

2012-09-25 02:28 by ggzwtj, 2724 阅读, 1 推荐, 收藏, 编辑
摘要:Trie树用来给字符串排序的时候有一个好处:边读边排序,但是读完之后要输出的时候麻烦来了。经过测试,用26W个word建立的Trie中,空白位是使用位的20倍左右,那么在Trie比较大的时候当然也就比较慢了。这篇文章讨论的优化主要是去避免访问这些空白位,实现方式无关(数组或指针?)。 首先想到的一个方法是:在insert的时候顺便标记这个节点有哪些子节点。因为总共只有26种可能性,那么自然也就想到了用一个int作为flag,如果0位置1则表示有‘a’这个子节点。 第一步(记录)完成了,下面我们来看如何来使用该记录?熟悉位移的同学可能已经想到:可以使用x&-x来计算出最低位为1的数。但是 阅读全文

鬼魂算法

2012-09-23 12:31 by ggzwtj, 4027 阅读, 5 推荐, 收藏, 编辑
摘要:这个方法的名字是从一个大学同学那里得来的。算法本身非常简单,但是这个名字太酷了,所以决定写下来。题目一:一个管子里有N个球,它们都在以1M/S的速度(向左或向右)移动,在两个球发生碰撞时,各自掉头并且速度不变,问:多长时间之后N个球全部落地?相信很多泡过论坛的人这个题目不只见过一次,而解决方法也很简单。为了方便下面进一步的说明,这里赘述一下:如果换个描述的方法:两个球在相遇的时候,他们并没有发生碰撞而是互相穿越而过(就像两个鬼魂相遇时一样),但是他们的编号互换了。显然,这种描述和题目中的描述是等价的。在这种描述下问题就很好解决了,球与球之间并没有发生碰撞,它沿着它开始的方向移动到对应的尽头便落 阅读全文

对偶问题

2012-09-18 21:20 by ggzwtj, 11681 阅读, 3 推荐, 收藏, 编辑
摘要:线性规划中一个经典问题的描述如下: 某工厂有两种原料A、B,而且能用其生产两种产品:1、生产第一种产品需要2个A和4个B,能够获利6;2、生产第二种产品需要3个A和2个B,能够获利4;此时共有100个A和120个B,问该工厂最多获利多少?用数学表达式描述如下:已知:2×X1+3×X2≤1004×X1+2×X2≤120求:max 6×X1+4×X2 工厂除了拿原料生产成产品卖掉这条出路外,还有一种方法是直接将原料卖掉。当然,不管是怎么做都要利益越大话!也就是说,把原料卖掉赚的钱比生产成产品赚的钱多,才去会这样做。那么最低可以接受多少的价 阅读全文

字符串匹配

2012-08-24 22:04 by ggzwtj, 1621 阅读, 1 推荐, 收藏, 编辑
摘要:在字符串的计算过程中,总是有重复计算的部分,而正是这些部分导致了计算复杂度的上升。后缀数组1、倍增算法:在构造后缀数组的过程中需要两个数组:rank和suffix。rank保存的是这个字符的排名,而suffix则是保存的则是排名对应的位置。举个例子:为了增加效率就要减少重复劳动,为了减少重复劳动就要在这次的比较中用上上次比较的结果(这个地方是不是和KMP很像)。怎么用上呢?比如长度为4的字符串C可以分成两个长度为2的字符串A和B,在将C与其他串比较的时候,只有在A相同的时候再去比较B。当然也可以说把C分成1:3的两个串A和B,但是这样的话,在知道A相同的时候怎么知道字符串之间B部分的关系呢?在 阅读全文

@功能的猜测

2012-08-17 00:19 by ggzwtj, 200 阅读, 0 推荐, 收藏, 编辑
摘要:闲来无事,八卦一下@功能(下面的规则是用新浪微博做的实验)。先举个例子:如果有一个昵称是【明天hui更好】,由于支持拼音,需要匹配下面的两个串: 【明,天,h,u,i,更,好】;【ming,tian,h,u,i,geng,hao】;通过测试发现匹配的规则还是比较苛刻的:如果是汉字匹配汉字,必须完全匹配,比如【名】和【明】无法匹配;如果是拼音匹配汉字,必须和汉字的读音完全匹配【min】和【ming】无法匹配(除非是【min天】这种后面是汉字的);必须从头匹配到尾,【明天更好】和【明天hui更好】是无法匹配的;还有一个放宽了的地方是:【更好】是可以和【明天hui更好】匹配的; 如果按照上的功能做@ 阅读全文

内存

2012-08-10 00:46 by ggzwtj, 960 阅读, 0 推荐, 收藏, 编辑
摘要:这篇文章要说的是内存管理的数据结构以及这些数据结构的建立方法等问题,首先要区别下面的三种地址:物理地址:也就是内存条上的一个一个的单位;逻辑地址:段的管理方式中用到,结构为[段描述符:偏移量];线性地址:页表管理方式中的地址; Linux启动时首先运行在实模式下,这时候EIP中保存的还是物理地址。这时会设置好8MB(2K个页面)空间的页面映射,最低的3位都是1。然后将swapper_pg_dr的地址装入到CR3中,CR0最高位设置为1,这就开启了分页机制。然后通过一个JUMP指令使得EIP的指令从物理地址变成线性地址。这部分的数据结构如下:在完成内存的探测之后就会用bootmem分配器来管理内 阅读全文

进程

2012-08-07 01:37 by ggzwtj, 1009 阅读, 0 推荐, 收藏, 编辑
摘要:命名空间:命名空间提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面来查看运行系统的全部属性。具体的组织方式如下:pid:内核对PID的内部表示,不同task_struct中的不同部分可能指向同一个pid;upid:特定命名空间中可见的信息;pid_namespace:代表了一个命名空间,组织成树形结构,保存了生成唯一PID的数据结构;nsproxy:汇集指向特定于子系统的命名空间包装器的指针;pid_hash:根据PID和所在的namespace进行散列;task_struct:保存一个进程的信息; 从上面的图中可以看到在知道pid,task_struct,nr,ns等不同信息的时候如何 阅读全文

glibc内存管理

2012-08-02 20:53 by ggzwtj, 2423 阅读, 0 推荐, 收藏, 编辑
摘要:X86平台LINUX进程内存布局如下:上面个段的含义如下:text:存放程序代码的,编译时确定,只读;data:存放程序运行时就能确定的数据,可读可写;bss:定义而没有初始化的全局变量和静态变量;heap:一般由程序员分配,如果不释放的话在程序结束的时候可能被OS回收;stack:有编译器自动分配释放,存放函数的参数、局部变量等;Mmap:映射区域;程序可以直接使用系统调用来管理heap和mmap,但更多的时候是使用C提供的malloc和free来动态地分配和释放内存。Linux上的stack的限制大致是8M,而在Windows上为2M。 C风格的内存管理程序:也就是malloc和free, 阅读全文