摘要: 江湖救急 192.168.0.1 阅读全文
posted @ 2016-01-22 17:08 huangnima 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 前几天有人问我之前写的那个跳舞链解数独的程序的内存泄漏问题如何解决,因此回顾了一下我的那个程序。现在看来那个程序简直不忍直视,于是大刀阔斧的改了。主要是把动态内存分配都改为了静态预分配,这样就可以避免频繁的调用malloc和free。同时静态分配的好处就是内存访问局部性比较好,cache不容易mis... 阅读全文
posted @ 2014-08-24 13:59 huangnima 阅读(511) 评论(0) 推荐(0) 编辑
摘要: 个人感觉是ac了,只不过没有注册编程之美的号,所以没有办法测试,反正对于自己手写的几个例子都正确。这里偷了一下懒,就是把行数限制为64个以内,这样好做位操作。当然可以用两个长整型来表示,这样就可能比较麻烦了。有意愿的人自己去完善吧。核心思想是预处理加减枝加深搜,复杂度最坏指数级没办法。下面贴一下题目... 阅读全文
posted @ 2014-04-14 09:53 huangnima 阅读(349) 评论(2) 推荐(0) 编辑
摘要: Vc++内存布局测试平台Windows server 2012 R2 and visual studio 2013 professional。本篇文章意在介绍vc++中类的内存布局方式,只是研究其大概的排列方式,对于内存对齐方面则没有进行深入探讨。如有需要研究类的具体大小可以参考其他博客。测试方式在vs中,查看类的内存布局主要有两种方式。一种是实例化一个类,然后在debug状态下查看其数据成员。另外一种是在工程属性的c/c++ 的command line 中加入/d1reportSingleClassLayout[className],其中的[className]是你想查看内存布局的类的名字, 阅读全文
posted @ 2014-02-13 14:57 huangnima 阅读(1319) 评论(2) 推荐(0) 编辑
摘要: 最长上升子序列的最优算法 1 问题背景 最长上升子序列问题(Longest Increasing Subsequence)在算法教学中的经典问题,在学习动态规划(Dynamic Programming)相关内容时经常出现。在动态规划这一章节中出现的频率只比最长公共子序列(Longest Common Sequence)小。最长上升子序列问题的动态规划解法的时间复杂度为n2,而我们可以得到的最长上升... 阅读全文
posted @ 2013-12-21 18:39 huangnima 阅读(741) 评论(2) 推荐(0) 编辑
摘要: 通过位操作来生成组合 阅读全文
posted @ 2013-12-05 12:14 huangnima 阅读(443) 评论(0) 推荐(1) 编辑
摘要: 本文章讨论的是将一个包含n个不同元素的集合分割为所有的s个不为空的集合,且每次生成的s个集合不需要考虑顺序关系。相关的背景内容在我的倒数第四篇博客中已经说了,这篇文章主要是贴代码。 1 #include 2 #include 3 #define SET 6 4 #define PART 3 5 //这里我们执行的时候用先进先出队列来模拟整个的生成情况 6 struct set_par_link 7 { 8 int* new_set;//代表当前的生成的集合划分 9 struct set_par_link* next_set_par;//代表的是另外的一个集... 阅读全文
posted @ 2013-12-01 00:07 huangnima 阅读(1131) 评论(0) 推荐(0) 编辑
摘要: 这篇文章翻译自coolest way to generate combination,但不是全译,如有错误欢迎指出。文章中把他们这个快速生成所有的组合的方法称为 cool-lex方法,特点是最后可以优化成没有循环和分支判断语句的执行代码。下面,我们先来介绍一些定义。什么是前缀,什么是后缀我就不罗嗦了。定义\(S =s_1 ,s_2,s_3,\cdots s_m\)是一个字符串序列,字母集合为0,1。\(Sb = s_1 b,s_2 b,s_3 b,\cdots s_m b\) , \( S[i]=s_i\),\(first(S)=s_1\),\(last(S)=s_m\),\( \vec(S) 阅读全文
posted @ 2013-11-29 18:56 huangnima 阅读(1307) 评论(2) 推荐(0) 编辑
摘要: 这方面的一般算法是递归,可是递归的效率略坑。另外一个经典的算法是next permutation,即从右边开始找到第一个非增序(从右到左)的最短序列,然后将这个序列最左端的数调换为递增序中第一个比他大的数,然后将右端排序为降序(从右到左),这样就得到了比当前排列刚刚好大一点的新的排列。如此往复就可以生成所有的排列,初始的是1234...n,最后是n....4321。每次生成的过程中都需要扫描尾端得到最短序列,然后二分查找第一个比他大的数,然后替换,然后剩下的重排序(其实重排序只需要将替换之后的排列逆序就可以了)。可以看出每次生成都需要交换大于等于两个位置的数,平摊下来代价仍然很大。下文所说的生 阅读全文
posted @ 2013-11-28 22:26 huangnima 阅读(1344) 评论(0) 推荐(0) 编辑
摘要: 常数时间生成集合划分本文章是Shin-ichiro KAWANO and Shin-ichi NAKANO的论文 constant time generation of set partition的部分翻译,限于译者的水平,不保证准确,本文最后的插图也是来自此论文。绪论在实践中常常需要生成一个包含N个元素的K子集划分。其中每个子集都是非空子集,而且全集中每个元素都是相互可区分的,但是子集中的元素没有顺序观念,只是一个集合。因此我们给全集中每个元素生成一个标号,按任意顺序排列元素,然后从1标号到N。因此前述问题可以等价为1-N这些自然数分割为K个子集,下面要描述的算法就是这样一个渐进意义上的常数 阅读全文
posted @ 2013-11-10 23:41 huangnima 阅读(653) 评论(1) 推荐(0) 编辑