algorithm相关内容
我知道这个问题不太具体. 我只想有人告诉我如何将普通合并排序转换为就地合并排序(或具有恒定额外空间开销的合并排序). 我只能找到(在网上)说“它太复杂"或“超出本文范围"的页面. 唯一已知的就地合并方法(没有任何额外空间)过于复杂,无法简化为实用程序.(取自从这里) 即使太复杂了,如何就地进行归并排序的基本概念是什么? 解决方案 Knuth 将此作为练习(第 3 卷
..
我有一张这样的桌子 创建表站点(site_Id int(5),parent_Id int(5),site_desc varchar2(100)); 字段意义: site_Id :网站的 ID parent_Id : 网站的父 ID site_desc : 虽然与问题无关,但有网站描述 要求是,如果我有一个 site_id 作为输入,并且我需要在站点下方标记的所有 id.例如:
..
从一个大的 [String] 和给定的子数组大小开始,我可以将这个数组拆分为更小的数组的最佳方法是什么?(最后一个数组将小于给定的子数组大小). 具体例子: 使用最大拆分大小 2 拆分 [“1"、“2"、“3"、“4"、“5"、“6"、“7"] 代码将产生 [[“1"、“2"]、[“3"、“4"]、[“5"、“6"]、[“7"]] 显然我可以更手动地执行此操作,但我觉得像
..
C++ 标准库中的 std::sort 算法(及其表亲 std::partial_sort 和 std::nth_element)是在大多数实现中更基本的排序算法的复杂和混合合并,例如选择排序、插入排序、快速排序、合并排序或堆排序. 这里和姐妹网站上有很多问题,例如 https://codereview.stackexchange.com/ 与错误、复杂性有关以及这些经典排序算法实现的其他方
..
我已经阅读了 一篇文章,关于各种 shuffle 算法在 编码恐怖.我已经看到有人在某处这样做来洗牌: var r = new Random();var shuffled = ordered.OrderBy(x => r.Next()); 这是一个好的洗牌算法吗?它是如何工作的?这是一种可接受的方式吗? 解决方案 这不是我喜欢的洗牌方式,主要是因为它是 O(n log n) 没有充分的
..
我想用 ATmega168/将大量数据存储到我的 Arduino 上ATmega328 微控制器,但遗憾的是只有 256 KB/512 KB 的 EEPROM 存储空间. 我的想法是使用压缩算法来减少大小.但是,我对压缩算法的了解非常少,而且我对现成库的搜索失败了. 那么,有没有优化存储大小的好方法呢? 解决方案 你可以看看 LZO 算法,设计为轻量级.我不知道AVR系统是否有
..
我有一台具有 1 MB RAM 且没有其他本地存储的计算机.我必须使用它通过 TCP 连接接受 100 万个 8 位十进制数字,对它们进行排序,然后通过另一个 TCP 连接将排序后的列表发送出去. 数字列表可能包含重复项,我不能丢弃.代码将放在 ROM 中,所以我不需要从 1MB 中减去我的代码大小.我已经有了驱动以太网端口和处理 TCP/IP 连接的代码,它的状态数据需要 2 KB,包括一
..
任何人都可以指点我如何在低内存条件下( 解决方案 大家使用的 zlib 库臃肿等问题(嵌入式).我很确定它不适用于您的情况.我有更多的内存,可能是 16K,但无法适应.它分配和归零大块内存并保留内容的副本等.算法也许可以做到,但找到现有代码是一个挑战. 我用 http://lzfx.googlecode.com 解压循环很小,它是较旧的 lz 类型压缩依赖于先前的结果,因此您需要访问未压
..
一般而言,您如何设置最小比较次数? 解决方案 引用 Donald Knuth(通过 Wikipedia,因为我目前没有我的 TAOCP 副本),比较次数的下限是六: http://en.wikipedia.org/wiki/Selection_algorithm(向下滚动到标题为“下界"的部分). 实际上,您的目标是找到 k 个最小值,其中 k 是列表大小的一半,向上取整(因此
..
我正在尝试解决以下问题:正在将数字插入容器中.每次插入一个数字时,我都需要知道容器中有多少元素大于或等于当前插入的数字.我相信这两种操作都可以在对数复杂度中完成. 我的问题:C++ 库中是否有可以解决问题的标准容器?我知道 std::multiset 可以在对数时间内插入元素,但是如何查询呢?还是我应该实现一个数据结构(例如二叉搜索树)来解决它? 解决方案 好问题.我认为 STL 中
..
在对 mpl::find 执行 mpl::find 之后,是否可以获得 mpl::vector 的偏移量? 换一种说法,我想做以下等价的编译时间: #include #include #include 主函数(){typedef std::vectorv_type;v_type v_int(3);
..
我不确定这是否可能,但对我来说似乎有点合理,我正在寻找一种允许我执行这些操作的数据结构: 用 O(log n) 插入一个项目 用 O(log n) 移除一个项目 查找/编辑 O(1) 中的第 k 个最小元素,用于任意 k(O(1) 索引) 当然,编辑不会导致元素顺序发生任何变化.使之成为可能的原因是我将以递增的顺序一个接一个地插入元素.因此,例如,如果我尝试第五次插入,我确信在这之
..
假设我需要从 1000000 个随机数值序列中检索中位数. 如果使用任何但 std::list,我没有(内置)方法来对中值计算的序列进行排序. 如果使用 std::list,我无法随机访问值来检索排序序列的中间(中位数). 自己实现排序并使用例如是否更好?std::vector,还是使用std::list和使用std::list::iterator来for-loop-走到中间值?
..
我正在尝试使用自定义排序谓词构建堆.由于进入它的值是“用户定义"类型,我无法修改它们的内置比较谓词. 有没有办法做类似的事情: h = heapq.heapify([...], key=my_lt_pred)h = heapq.heappush(h, key=my_lt_pred) 或者更好的是,我可以将 heapq 函数包装在自己的容器中,这样我就不需要继续传递谓词了. 解决方案
..
我有两组范围.每个范围都是一对整数(开始和结束),表示单个较大范围的某个子范围.两组范围的结构与此类似(当然 ...s 将替换为实际数字). $a_ranges ={a_1 =>{开始=>...,结束=>...,},a_2 =>{开始=>...,结束=>...,},a_3 =>{开始=>...,结束=>...,},# 等等};$b_ranges ={b_1 =>{开始=>...,结束=>...,
..
给定一个整数数组,迭代它并找出它所涵盖的所有范围的最简单方法是什么?例如,对于一个数组,例如: $numbers = array(1,3,4,5,6,8,11,12,14,15,16); 范围是: 1,3-6,8,11-12,14-16 解决方案 如果数组按升序排序,那么问题就简单了.定义一个 Range 结构或类,它有一个开始和一个结束.然后遍历数组.如果当前元素比前一个元素多一个,
..
假设您有一组范围: 0 - 100: 'a' 0 - 75:'b' 95 - 150: 'c' 120 - 130:'d' 显然,这些范围在某些点重叠.您将如何剖析这些范围以生成不重叠范围的列表,同时保留与其原始范围相关的信息(在本例中为范围后面的字母)? 例如上面运行算法后的结果是: 0 - 75:'a'、'b' 76 - 94: 'a' 95 - 100:'a
..
给定一个(未排序的)数组 S 和某个整数 k,求 i,j 对的数量,使得 S[i...j] 的范围 ķ.其中范围是 max(S[i...j]) - min(S[i...j]). 我在一次采访中收到了这个问题,在对 S 进行排序后,我只能想出一个 O(nlogn) 的解决方案.但是,我被告知有一个 O(n) 的解决方案.有什么想法吗? 解决方案 从 i,j = 0 开始,我们可以迭代
..
以下是某人给我的练习面试问题,我不确定最好的解决方案是什么: 给定一组范围: (例如 S = {(1, 4), (30, 40), (20, 91) ,(8, 10), (6, 7), (3, 9), (9,12), (11, 14)}. 并给定一个目标范围 R(例如 R = (3, 13) - 表示范围从 3 到 13).编写一个算法来找到覆盖目标范围的最小范围集.集合中的所有范围必须重
..
我有一个随机排序的唯一封闭范围列表 R0...Rn-1 其中 Ri = [r1i, r2i] (r1i
..