- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑具有 order
属性的对象。对象将根据此属性进行排序。
给定以下限制和操作,您将如何分配 order
属性?
操作(按重要性排序)
push(object)
:在索引 0 处插入对象。
swap(indexN, indexM)
:将索引 N 处的对象与索引 M 处的对象交换。
remove(object)
:删除对象。其余元素必须保持相同的顺序。
insert(object)
:按给定顺序插入对象。
限制
更改对象的 order
属性代价高昂。应尽量减少更改。
order
可以是整数或 float ,具体取决于实现的要求。
如果 order
保持唯一,则 insert
操作必须包含一种方法来修复 order
(如果它已经存在),并进行尽可能少的更改尽可能。可以假定,如果插入的对象与现有对象具有相同的 order
,则有另一个标准来确定哪个先出现。
如果 order
允许重复,则操作 swap
必须包括一种方法来修复交换元素的 order
如果它们具有相同的值,再次尽可能少地进行更改。惩罚操作 insert
是首选。
很可能这个问题已经有了名称和已知的解决方案,但我第一眼找不到。
最佳答案
使用 float 排序
对于 push
,为对象分配一个顺序,该顺序等于现在位于索引 1 处的对象的顺序减去 1 (list[0].order = list[1].order - 1
)
对于swap
,交换两个对象的顺序(temp = list[i]; list[i] = list[j]; list[j] = list[i]; temp = list[i].order; list[i].order = list[j].order; list[j].order = temp
);如果这可能会引入一致性问题,那么理想情况下,您可以在元素上放置一个 transit
标志,以指示它们的顺序正在被修改,或者在最坏的情况下锁定对象直到它们一致
对于 remove
,什么都不做 - 列表中的对象仍然是有序的,您只是在序列中引入了一个间隙,这应该不是问题
insert
是唯一有问题的。如果您在索引 i
处插入一个元素,那么它的顺序等于索引 i-1
和 i+ 处元素顺序的平均值1
(list[i].order = (list[i-1].order + list[i+1].order)/2
)。验证此新订单不等于索引 i-1
或 i+1
处的订单(list[i].order != list[i- 1].order && list[i].order != list[i+1].order
) - 这表明您已经达到机器 epsilon。当这种情况发生时(这种情况应该很少发生)你有两个选择:
0
的顺序,在索引 1 处分配一个 1
的顺序,...一个 的顺序>n
在索引 n 处。list[i-1].order = (list[i-2].order + list[i-1].order)/2
和 list[i+ 1].order = (list[i+2].order + list[i+1].order)/2
重新排序之前 list[i] = (list[i-1] + list[ i+1])/2
,再次验证您在 [i-1] 和 [i+1] 重新排序时未达到机器 epsilon - 如果您已达到机器 epsilon,例如[i-1],然后首先将 [i-2] 重新排序为 list[i-2].order = (list[i-3].order + list[i-2].order)/2
,然后重新排序 [i-1]。如果 [i-2] 重新排序命中机器 epsilon,则首先重新排序 [i-3],依此类推。 (如果到达列表的末尾,则只需减少元素 [0] 的顺序或增加元素 [n] 的顺序。)如您所见,在最坏的情况下,级联重新排序的代价更高而不是简单地硬着头皮重新排序整个列表;但是,重新排序很可能会保留在本地。一个好的折衷办法是,如果级联次数太多(对于“太多”的合理值),则进行完整的重新排序。关于algorithm - 使用 order 属性重新排序对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792314/
我正在寻找通过 sql 查询对我的 sql 结果进行排序,大概在 order by 子句中使用某种嵌套的 order by/order by 我有以下数据: TERM USER I
我有一个表格,其中包含如下所示的部分数据。我已经在 edition_id 上完成了订购。现在还需要订购 laungauge_id,这取决于 edition_id 的值。 Edition_id 是指报纸
所以我有两个表,Questions 和 Answers,由多对多关系表 QuestionsAnswers 连接。 Questions 有一个排序列,允许我控制它们如何显示给用户,而 Questions
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
在具有多个 order by 子句的 SQL 查询中,它们是否真的在执行期间全部运行? 例子: select * from my_table order by field5, field3, fiel
我跟进 query其中 schema.org 数据库用于查找类的子级数量 - 作为比我的应用程序更简单的数据库。我想按字母顺序连接 child 的名字。查询: prefix schema: pre
正如 nazdrovje 所指出的(参见 here ) Ordering@Ordering 可用于获取列表中每个元素的排名。即使列表包含重复元素,结果也是 n 排列(作为整数 1 到 n 的有序列表,
我有两张 table 。 它们都有日期和 item_id 列。 我正在通过 item_id 加入他们。 结果应按两个日期列一起排序 下面的代码有效,生成正确的结果集... 但是它们仅按第一个表的日期排
尝试掌握 SQL 我想按日期订购,然后在其中按标题订购。 示例: SELECT * FROM tblboek ORDER BY jr_van_uitgave DESC 如何在按年龄的订单中按头衔排序?
我想使用 FIELD 参数对我的 SQL 输出进行排序,但是当我这样做时,它首先吐出我不想要的结果,然后它首先吐出我想要的结果。在结果之上,它首先吐出。如果这有意义的话 ;) 如何先吐出已定义的值,然
我有一个无法破解的排序问题。我这样从我的表中选择: SELECT * FROM 'sidemodules' WHERE name = 'module1' OR name = 'module2' OR
我对 Django oscar 的覆盖模型有疑问。我想为模型添加一个新字段,但是当我这样做时,我遇到了 RuntimeError: Conflicting 'order' models in appl
我有两个表,电影和类别,我想先按CategoryID获得一个排序列表,然后按名称排序。。电影表格有三个列ID、NAME和CategoryID。CATEGORY表有两列ID和NAME。。我尝试了下面这样
In a MySQL query, when using the DISTINCT option, does ORDER BY apply after the duplicates are re
我想创建一个 sql 查询,为 2 个不同的查询一起返回结果。例如,我想要以下形式的结果:产品名称, avg(price), min(price), max(price), avg(order), m
我正在使用行号从存储过程中获取分页结果。 我发现使用动态 case 语句列名称进行排序会减慢速度 - 但如果我对所有内容进行硬编码就可以了。 有没有办法通过不使整个 sql 查询一个字符串并使用 SP
如何在范围搜索中使用Morton Order? 在wiki中,在“使用一维数据结构进行范围搜索”段落中, 它说 "the range being queried (x = 2, ..., 3, y =
我正在使用 sequelize.js,我在使用 order 语句时遇到问题,我想先通过 if id 排序(如果我的 id 在该别名表中),然后再排序.... order = [['alias', 'i
我有一个 php 脚本,它从数据库中提取内容并以某种方式打印它们。数据库有一个名为“order”的列标题,它的 INT 大小为 11。当我从数据库中获取数据时,我试图按数据库中的值“order”对内容
我有一个带有 ORDER BY 子句的 UPDATE 查询。我已将相同的查询复制到具有相同 ORDER BY 子句的 SELECT 中,但得到了不同的结果。 更新查询: UPDATE t_locks
我是一名优秀的程序员,十分优秀!