- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种算法来合并两个排序列表,但是它们缺少一个列表的元素与另一个列表的元素之间的比较运算符。生成的合并列表可能不是唯一的,但任何满足每个列表的相对排序顺序的结果都可以。更准确地说:
给定:
{a_1, ..., a_m}
, B = {b_1, ..., b_n}
. (它们也可以被视为集合)。<
在每个列表的元素之间定义,使得 a_i < a_{i+1}
, 和 b_j < b_{j+1}
对于 1 <= i <= m
和 1 <= j <= n
.a_i < b_j
没有为任何有效的 i
定义和 j
.=
在 A 或 B 的所有元素中定义(它在 A 的元素和 B 的元素之间定义)。生产:列表 C = {c_1, ..., c_r}
这样:
C = union(A, B)
; C 的元素是 A 和 B 的元素的并集。c_p = a_i
, c_q = a_j
, 和 a_i < a_j
, 然后 c_p < c_q
. (元素的顺序应保留对应于集合 A 和 B 的 C 的子列表。i
和 j
这样 c_i = c_j
.(删除 A 和 B 之间的所有重复元素)。我希望这个问题是有道理的,而且我不是在问一些非常明显的问题,或者没有解决方案的东西。
上下文:
一个可构造的数字可以精确地表示为有理数域的有限多个二次扩展(使用高度等于域扩展数的二叉树)。因此,可构造数字的表示必须“知道”它所表示的字段。列表 A 和 B 表示有理数的连续二次扩展。A 和 B 的元素本身是可构造的数字,在上下文中定义以前较小的字段(因此优先运算符)。添加/乘以可构造的数字时,必须首先合并二次扩展域,以便二进制算术可以进行操作;结果列表 C 是二次扩展域,它可以表示字段 A 和 B 都可以表示的数字。(如果有人对如何以编程方式处理可构造数字有更好的想法,请告诉我。有关可构造数字的问题有 arisen before ,这里还有关于它们表示的一些 interesting responses。)
在有人问之前,不,这个问题不属于mathoverflow;他们讨厌算法(通常是非研究生水平的数学)问题。
实际上,列表 A 和 B 是链表(实际上以相反的顺序存储)。我还需要跟踪 C 的哪些元素对应于 A 和 B 中的哪些元素,但这是次要的细节。我求的算法不是mergesort中的merge操作,因为在合并的两个列表的元素之间没有定义优先运算符。一切最终都将在 C++ 中实现(我只希望运算符重载)。这不是家庭作业,最终将开源,FWIW。
最佳答案
我认为你不能比 O(N*M) 做得更好,尽管我很乐意犯错。
既然如此,我会这样做:
如果您想检测 A 和 B 的不兼容顺序,则从步骤 2 中删除“(剩下的)”。搜索整个 B,如果您发现它“太早”,则引发错误。
问题是给定 A 的一般元素,没有办法在比线性时间(以 B 的大小)更好的时间内在 B 中寻找它,因为我们只有一个相等性测试。但显然我们需要以某种方式找到匹配项并且(这是我挥手的地方,我无法立即证明)因此我们必须检查 A 的每个元素是否包含在 B 中。我们可以避免一堆比较因为两组的顺序是一致的(至少我假设是一致的,如果不一致就无解)。
所以,在最坏的情况下,列表的交集是空的,并且 A 的所有元素都不能与 B 的 任何 元素进行顺序比较。这需要 N*M 等式测试才能建立,因此最坏情况下的界限。
对于您的示例问题 A = (1, 2, c, 4, 5, f), B = (a, b, c, d, e, f),这给出了结果 (1,2,a, b,c,4,5,d,e,f),这对我来说似乎不错。它在此过程中执行 24 次相等性测试(除非我数不清):6 + 6 + 3 + 3 + 3 + 3。以相反的方式与 A 和 B 合并将产生 (a,b,1,2,c ,d,e,4,5,f),在这种情况下具有相同的比较次数,因为匹配元素恰好在两个列表中处于相同的索引处。
从例子中可以看出,操作不能重复。 merge(A,B) 导致列表的顺序与 merge(B,A) 的顺序不一致。因此 merge((merge(A,B),merge(B,A)) 是未定义的。一般来说,合并的输出是任意的,如果你使用任意订单作为新的完整订单的基础,你会生成相互不兼容的订单。
关于合并两个列表之间缺乏比较的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129525/
我有几个长度不等的 vector ,我想对其进行cbind。我将 vector 放入列表中,并尝试结合使用do.call(cbind, ...): nm <- list(1:8, 3:8, 1:5)
合并(合并)两个 JSONObjects 的最佳方式是什么? JSONObject o1 = { "one": "1", "two": "2", "three": "3" }
我在一个表中有许多空间实体,其中有一个名为 Boundaries 的 geometry 字段。我想生成一个具有简化形状/几何图形的 GeoJson 文件。 这是我的第一次尝试: var entitie
谁能说出为什么这个选择返回 3.0 而不是 3.5: SELECT coalesce(1.0*(7/2),0) as foo 这个返回 3: SELECT coalesce(7/2,0) as foo
首先抱歉,也许这个问题已经提出,但我找不到任何可以帮助我的东西,可能是因为我对 XSLT 缺乏了解。 我有以下 XML: 0 OK
有时用户会使用 Windows 资源管理器复制文件并在他们应该执行 svn 存储库级别的复制或合并时提交它们。因此,SVN 没有正确跟踪这些变化。一旦我发现这一点,损坏显然已经完成,并且可能已经对相关
我想组合/堆叠 2 个不同列的值并获得唯一值。 如果范围相邻,则可以正常工作。例如: =UNIQUE(FILTERXML(""&SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPO
使用iTextSharp,如何将多个PDF合并为一个PDF,而又不丢失每个PDF中的“表单字段”及其属性? (我希望有一个使用来自数据库的流的示例,但文件系统也可以) 我发现this code可以正常
是否有一个合并函数可以优先考虑公共(public)变量中的非缺失值? 考虑以下示例。 首先,我们生成两个 data.frames,它们具有相同的 ID,但在特定变量上有互补的缺失值: set.seed
我们正在尝试实现 ALM Rangers 在最新的 Visual Studio TFS Branching and Merging Guide 中描述的“基本双分支计划”。 .从指导: The bas
我在不同目录(3个不同名称)中有很多(3个只是一个例子)文本文件,如下所示: 目录:A,文件名:run.txt 格式:txt制表符分隔 ; file one 10 0.2 0.5 0.
我有一张包含学生等级关系的表: Student Grade StartDate EndDate 1 1 09/01/2009 NULL 2
我在学习 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associatio
我觉得我有世界上最简单的 SVN 用例: 我有一个文件,Test.java在 trunk SVN的。 我分行trunk至 dev-branch . 我搬家Test.java进入 com/mycompa
我有两个数据框,其中一些列名称相同,而另一些列名称不同。数据框看起来像这样: df1 ID hello world hockey soccer 1 1 NA NA
Elasticsearch 中是否缺少以扁平化形式(多个子/子aggs)返回结果的方法? 例如,当前我正在尝试获取所有产品类型及其状态(在线/离线)。 这就是我最终得到的: aggs [ { key:
如何合并如下所示的 map : Map1 = Map(1 -> Class1(1), 2 -> Class1(2)) Map2 = Map(2 -> Class2(1), 3 -> Class2(2)
我试图通过从netezza服务器导入数据来合并两个数据集。 以下是数据集,其数字为,ID为,字母为,名称为: 下表都是使用命令从netezza导入的: sqoop import --connect n
我有两个数组 $array1 = array('first', 'second', 'third', 'fourth'); $array2 = array('first', 'third', 'fou
我正在 SQL Server 中运行合并。在我的更新中,我只想在值发生更改时更新该行。有一个版本行在每次更新时都会递增。下面是一个例子: MERGE Employee as tgt USING (SE
我是一名优秀的程序员,十分优秀!