【💰】拖拽排序,最小修改次数问题

10 条回复
60 次浏览

比如

复制
数据行: A B C D E
序号: 1 2 3 4 5

拖拽列表,将数据行移动到其他位置

复制
数据行: A E C D B
序号: 1 5 3 4 2

E 移到 第 2 位
这个时候如果要更新它们的排序序号,就需要更新 B C D E。

这里想到一个单次移动比较省的方法,是扩大它们的间隔,变成 [10, 20, 30, 40, 50],如果 E 移到A(10)B(20)之间,那么 E 就设置为(10+20)/2=15,只需要修改一行的排序序号的值,如果出现取中值冲突,所有数重新排序生成间隔。

但是前端是拖拽排序,并且是可以拖拽多次的,这里要求算出 初始排序 和 拖拽后的最终排序 怎样修改次数最少,这里考虑用到 最长公共递增子序列算法。

PS:实际上拖拽排序场景数据量不会太大,通常也很难上百吧。少量数据直接全量重新写入排序序号就可以了。但是仍然想问问有没有优雅的解决方法。

金币池
💰 408 金币

金币会随着回复数量动态增加,首次回复有概率获得金币池中部分金币奖励。

前排打手
Guardian

换个数据结构, 用单向链表.
A->B->C->D->E 要是拖拽 E 到 A 后面的话, 就把 A 的 next 改为 E, E 的 next 改为 B D 的 next 置为 null

A->E->B->C->D

这样不管怎么排, 数据量多大, 最多只需要处理 3 个节点就行

可以结合界面然后加上数组来组合一下, 渲染使用链表的顺序, 但是操作使用数组来取对应的值.

大概就是这么个意思, 我拍脑袋想的, 仅供参考

种子用户
OP

链表也是一个方法,但是如果要根据排序 列出先后就要遍历一遍,就是 O(N)了 🤔。

前后端都是我做,前端确实使用现成的组件了

前排打手
Guardian

@miku 你要是实在纠结的话 可以去 leetcode 上找个题参考一下 我记得有道题目的原理跟你的需求差不多 但是忘记题目了 😂

前排打手

就是都不用考虑这么多,拖拽本身就没多少数据

一个屏幕才能展示多少行数据

楼上的链表应该是简单的,“序号” 对于你的问题来说反而成了累赘,你需要的只有他们之间的相对前后关系。 如果非要记录序号,那就把序号额外记在另外一个数组里,比方说 index[0] = A, index[1] = B, 等拖拽完之后,它变成 index[0] = A, index[1] = E...

种子用户
OP

它变成 index[0] = A, index[1] = E... 纠结的就是这个修改次数了,就是希望它越小越好

按照这个单独维护一个 index 数组的该法,你唯一需要的修改就是修改 index 数据中对应索引处的值, 这里就是将 index[1] = B, 改成 index[1]= E, 其他都不用动

发表一个评论

R保持