PY有自己内建的工厂函数sorted用来排序, 它返回一个原地排序后的副本. 采用的是原地排序算法. 这个工厂函数的原型是:
{}sort(cmp=None, key=None, reverse=None) {}
继续阅读 »
分析:此题同Edit Step Ladders类似(至少在解法思路上很相似):把大象按体重递增排序,然后从排序后的最后一只大象开始向前“反攻倒算”,总的时间复杂度在O(n^2)。more
继续阅读 »
分析:使用回溯法求解。为了提高搜索效率,在选择“分支”时应该挑选“分支因子”较小的子树优先搜索,下面的order函数即为此目的而设。它根据单词所含字母在全句中出现的频度以及单词的长度给单词打分,然后根据分值对单词进行排序(升序),排在最后的单词会被首先破译,接下来是排在倒数第二的单词,依次进行。如果不使用order函数对加密后的单词进行排序就直接尝试破译也是可以的,不影响程序的正确性,只是会降低时间效率(虽然在本题中,仍不会超时)。more
继续阅读 »
链接:Link 耗时:0.586s
昨晚做的太急了,没时间写总结,正好下午有空,补上。
这是一道典型的树形动态规划,不是很难,但十分坑语言。思路大致如下:
对于第i个节点,用d(i)表示其上诉所需的最小工人数。若i为叶节点,则d(i)=1;否则,遍历求出i的子节点所对应的d值,并由小到大排序,取出最小的几个相加,即为d(i)。
很容易想到用递归来实现。但对于“子节点的d值的排序”实现起来却十分困难:因为事先不知道有多少个数。当然啦,如果是C++组,用vector可以轻松搞定,可至于P党,实现起来却难上加难。思来想去,决定试试Pascal的动态数组。磕磕碰碰调了近1个小时,终于AC了。
Code:
```pascal
//
继续阅读 »
算法:由输入经过一系列的计算步骤得到输出
排序问题:将无序的输入经过处理按照一定的孙徐输出
优秀的算法:
- 正确性(思路清晰)
- 高效(算法分析)
- 易于实现(现成的算法)
算法的用处:
- 生物信息学
- 网络(图论,字符串查找)
- 信息安全(RSA..)
- 优化(调度)
算法问题:
- 图论(最短路径...)
- LCS(动态规划...)
- 拓扑排序
- 凸包
数据结构:
C++ STL 优缺点 效率
难解问题:
并行算法
CPU效率
算法技术
算法的效率
渐近记号
问题规模量 时间T(n)
数组去重
继续阅读 »
【什么是Bit-map】
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0.
然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0x01
继续阅读 »
题目
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:$\sum_{i=1}^{n}{(a_i-b_i)^2}$
,其中 ai表示第一列火柴中第 i 个火柴的高度,bi表示第二列火柴中第 i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。
分析
这真是一道好题——断断续续想了几天才完全AC。
事实上,由排序不等式可知:
当$a_i, b_i$从小到大排序时,距离
继续阅读 »
原文链接:JavaScript Profiling With The Chrome Developer Tools
现在,让我们来让你的网站跑得更快,网站性能通常包括两个方面:页面加载速度和脚本执行速度,有很多方法可以让网站加载更快,例如,压缩文件和 CND 等,但是要让脚本执行更快就得靠开发人员自己了。
代码很小的改动就可能对性能产生巨大影响,不同位置的几行代码可能就意味着一个快的网站和产生可怕的“无响应脚本”对话框的网站之间的区别。本文展示了使用 Chrome 开发工具来找到这些性能关键点代码的一些方法。
建立基准线 ##
我们来看一个简单的颜色排序应用,这个应用展示了一个由各种颜色构成的网格,您可以拖放任意一个颜色点来
继续阅读 »
content
{:toc}
简单来说 Fisher–Yates shuffle 算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的。同时这个算法非常高效。
本文主要介绍这个算法的来源、演变、原理。并举出一个例子为大家清晰的描述每次迭代过程。最后使用 JavaScript 代码将算法实现。
继续阅读 »
链接:The Tower of Babylon 耗时:0.015s
这是刘汝佳的紫书中"DAG中的动态规划"中的习题,我拿它用来熟悉DAG中的动态规划。
我们不妨进行逆向考虑:现堆上面的方块,然后考虑在下面进行叠加。这样子一来,影响决策的就只是最下面方块的尺寸了。
对于这种出现了"大套小"这样的二元关系的题,我们可以将其视为一个有向无环图:其中每个节点为一个状态,状态的转移是有固定的方向的(在此题中,状态转移为从小的方块到大的方块)。
但是这道题又不同于平常的DAG动态规划:若将边长视为状态的话,则要开一个巨大的数组,这是不可以接受的。因此,我们要换一种思维方式:只记录方块的序号和摆放的方式(如现将边长从小到大进行排序,然后
继续阅读 »