上一页 1 ··· 3 4 5 6 7 8 下一页
摘要: 1000: 恶意IPTime Limit:1 SecMemory Limit:16 MBDescriptionWater同学最近好不容易学会了用Tornado建起一个个人的Website,并且成功上线了。来访用户逐渐增多,但Water发现总有些恶意用户很喜欢刷屏,总是回复些评论如“楼主不要放弃治疗!... 阅读全文
posted @ 2013-11-26 17:01 厕所门口~~ 阅读(618) 评论(0) 推荐(1) 编辑
摘要: 今天看一个博客看到一中找数的方法,感觉很有意思,就自己理解了下然后写了份代码...题目的意思是这样的:对一个相邻元素的差的绝对值都为1的一个数组,找出某个元素是否在其中出现过,若出现过的话打印它的一个下标,否则提示没找到。我们先来理解下,首先,相邻元素的差的绝对值为1,那么某个元素 n 和第一个元素 array[0] 的下标的差不大于 index = |n - array[0]|,如果下标位置index没找到元素,那么继续 index += |n - array[index]|,也就是从原index继续向下|n - array[index]|个位置,因为此时 n 和 array[index]的 阅读全文
posted @ 2013-11-26 00:18 厕所门口~~ 阅读(383) 评论(0) 推荐(0) 编辑
摘要: 基数排序:是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。但在大部分的情况下还是在用在证书的情况下比较多。我这里也是只用了整数来实现。如果有负数,则可以用将负数序列反序的方法达到排序效果。如果是小数或字符串,那就将字符串拆下进行排序就可以了。下面我来说说正整数用基数排序的原理:假设有序列:23, 45, 21, 1, 321, 34, 0.我们要对其排序,首先将序列变成位数相同,位数不够的在前面补0,变成如下: 023 045 021 001... 阅读全文
posted @ 2013-11-25 22:07 厕所门口~~ 阅读(562) 评论(0) 推荐(1) 编辑
摘要: 今天数据结构老师讲到了二叉树,还提了一下二叉排序树,然后我就纠结了,就实现来说,二叉排序树比堆排序简单多了。并且二叉排序树时间复杂度并不比堆排高...为毛排序中没有提到它?然后从教学区走到饭堂一直在想这个问题。。但是想着想着就拿各种排序来进行对比了。。。就没有然后了。。。。下面我来说说怎么用二叉排序树排序吧。首先是构建二叉排序树,二叉排序树的特点是: 左节点的所有元素比根节点小,右节点所有元素比根节点大。那么在构建二叉排序树的时候,插入的元素一定是插某个在叶子上的。在刚听到这个的时候我诧异了下,难道不用再进行像堆排序那样的堆化操作?然后我画了下图发现还真是这样... 阅读全文
posted @ 2013-11-25 20:58 厕所门口~~ 阅读(380) 评论(0) 推荐(0) 编辑
摘要: DescriptionYouhavejustmovedfromWaterlootoabigcity.Thepeopleherespeakanincomprehensibledialectofaforeignlanguage.Fortunately,youhaveadictionarytohelpyouunderstandthem.InputInputconsistsofupto100,000dictionaryentries,followedbyablankline,followedbyamessageofupto100,000words.Eachdictionaryentryisalinec 阅读全文
posted @ 2013-11-25 17:33 厕所门口~~ 阅读(400) 评论(2) 推荐(0) 编辑
摘要: 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。堆排序是跟二叉堆联系在一起的,它是利用二叉堆的性质设计的一种算法。所以它有父节点值总是大于(或小于其所有子节点)。一般情况下,二叉堆是如下所示的: 这是一个正序从小到大的序列。首先,肯定是插入问题了,我们首先要构造好一个堆。其实这里的插入用插入排序的方法就可以了。他的实现就是直接插入。。 1 void minHeapFixUp(int *arrayL, int newElementIndex) { 2 int fatherIndex ... 阅读全文
posted @ 2013-11-25 01:15 厕所门口~~ 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 我们都有过玩扑克牌的经验吧。。当你一张张拿起扑克牌的时候,你是不是按一定顺序的?当你拿起一张新的扑克牌的时候,就会把他插在某两个牌之间,你是为什么插在那里?是因为他的大小在两扑克牌之间是吧。插入排序的原理和你玩扑克牌插入的原理是一样的。通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。其实现算法如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果 阅读全文
posted @ 2013-11-24 02:49 厕所门口~~ 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 我们都知道,当原序列基本已经有序了的时候,采用插入排序的话其效率可以达到线性。但一般情况下插入排序的效率并不高。而希尔排序正是对它的一种改进。希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。下面具体来说说希尔排序的思想:假设一个数组如下:2 43 12 32 9 10 8 7 45 3, 此时数组长度 len = 10;第一步:此时 gap = 10 / 2 = 5。所以此时进行排序的组合为: . 阅读全文
posted @ 2013-11-23 21:26 厕所门口~~ 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 归并排序是分治法的一种体现,建立在归并操作上。归并排序的思想是将一个数组分成两部分A,B,如果A, B是有序的,那只要将A, B合并起来即可,那么如何保证A, B是有序的呢?那就将A, B按一样的方法各自分成两部分...如此到当分出来的A, B都只有一个元素的时候,A, B都是有序的了。这就是分治法的一种体现。这样因为A, B都是有序的,合并起来后就是一个完整的有序序列了。那么,改如何进行合并?他的思想是:先新开一个大小为A, B大小之和的数组cSeq,设两个指针a, b分别指向A, B的第一个元素,然后将a, b正想的元素较大的那个赋到cSeq。并将指向较大的那个的指针指向下一个....如此 阅读全文
posted @ 2013-11-23 19:43 厕所门口~~ 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 今天无聊就打算把所有的排序算法都看一遍。。。计数排序的时间复杂度是O(n),在算法导论中,用决策树模型中论证了,比较排序的情况为nlogn的复杂度。而计数排序的时间复杂度小于他的原因就是它不需要进行比较。计数排序的原理就是根据原数组(A)里面最大的元素来一个与其一样大的数组(B),新开的数组(B)的第 i 个元素的值就是 i 在原数组(A)里面出现的次数.这样就可以根据新开的数组(B)来确定原数组(A)的排序。我们先来看看排序部分的实现:(len是数组的长度)void countSort(int *arrayL, int len) { int findMax = 0; ... 阅读全文
posted @ 2013-11-23 17:35 厕所门口~~ 阅读(238) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 下一页