算法:将列表从一种顺序重新排列为另一种顺序的最佳方法?

2023-11-22

EDIT:我不确定我原来的问题是否足够清楚。我需要一种算法来计算将数组从一个顺序重新排列为另一个顺序的最小移动序列。众所周知,两个数组将包含相同的元素(没有重复)并且具有相同的长度。例如:

reorder(
  ['d', 'a', 'c', 'b', 'e'],
  ['a', 'b', 'c', 'd', 'e']
)

应该返回类似:

[
  {move:'d', after:'b'},
  {move:'c', after:'b'}
]

这表明我应该首先将元素“d”移动到“b”之后,然后将“c”移动到“b”之后,数组将按照所需的顺序排列。


背景:我正在开发一个项目(将大部分功能移至rtgui实际上是到客户端)。现在我正在做排序工作。基本上我有一个 div 列表,我想按任意顺序排序。我可以得到所需的订单如下:

var hashes = {
  before: [],
  after: [],
};
var els = $('div.interesting-class').toArray();
var len = els.length;

for(var i = 0; i < len; i++) hashes.before.push(els[i].id);
els.sort(getSortComparator());
for(var i = 0; i < len; i++) hashes.after.push(els[i].id);

Now hashes.before and hashes.after包含元素 ID 的无序列表和有序列表。重新排序列表时,到目前为止,最昂贵的操作实际上是移动 DOM 元素。我一直这样做:

var c = $('#container-id');
$(els).each(function() {
  c.append(this);
});

这可行,但速度比必要的慢,因为平均来说,只有 2 或 3 个元素真正需要移动。所以,我需要一种算法来计算将数组从一个顺序重新排列到另一个顺序的最小移动序列(在这种情况下,操作于hashes.before and hashes.after)。任何人都可以建议一个或提供任何想法吗?

到目前为止,我已经尝试了几种通用的“diff”算法,但它们并没有真正给我我想要的东西。我想我需要的就是这样,但更专业。


http://en.wikipedia.org/wiki/Longest_increasing_subsequence

找到最长的递增子序列(根据新的排序顺序)。然后将不在该序列中的每个元素移动到相对于序列中已有元素的位置。

在您的示例中,“a,b,e”和“a,c,e”与最长的递增子序列相关。您能做的最好的事情就是选择其中一个,然后移动其他元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法:将列表从一种顺序重新排列为另一种顺序的最佳方法? 的相关文章

随机推荐

  • PowerShell 计时器/秒表精度

    我发现 System Diagnostics Stopwatch 类似乎存在可测量的不准确性 即使在很短的时间段 即 20 秒 内也是如此 我的进程显示 编码为运行 20 秒的进程的运行时间为 20 3 秒以上 elapsed System
  • TFS 2010 - 用于转换为分支的命令行

    TFS 公开了一个涵盖大部分领域的命令行实用程序 不过 我正在创建一个脚本 它将在指定的项目中创建文件夹和分支结构 为此 我需要将我的卡车转换为分支 然后从那里进一步创建分支 我找不到执行此操作的命令 到目前为止我已经找到了这个link它描
  • 如何在反应中使用gapi

    我想使用gapi从google访问people api资源 我尝试了很多方法来完成这项工作 但我仍然无法得到任何响应 它没有错误 没有警告 这是我的代码 loadYoutubeApi const script document create
  • Firebase 存储视频流

    我正在开发一个具有视频流功能的应用程序 我正在使用 firebase 数据库和 firebase 存储 我试图找到一些有关 firebase 存储如何处理视频文件的文档 但找不到太多 文档中提到 Firebase 存储与其他谷歌应用服务配合
  • 获取Java中当前运行的所有线程的列表

    有什么方法可以获取当前 JVM 中所有正在运行的线程的列表 包括线程 not由我的班级开始 是否也可以获得Thread and Class列表中所有线程的对象 我希望能够通过代码来做到这一点 要获得可迭代集 Set
  • 通过ADB Android发送AT命令

    我的工作任务是调查是否可以通过 ADB shell 向 Android 设备发送 AT 命令 到目前为止 我已尝试回显 AT 命令 但它会将它们作为普通字符串传递 任何帮助请任何人 请尝试这个 echo e AT CFUN r n gt d
  • JSF 2.0 部分状态保存似乎不起作用

    我正在评估在高流量网站中使用 JSF 的可能性 有人告诉我 在 JSF 2 0 中 组件树不存储在会话中 并且一旦组件树被修改 只存储增量 这是我正在查看的页面
  • jQuery 追加 DOM

    jQuery append 的所有示例似乎都采用 html 字符串并将其附加到容器中 我的用例略有不同 我的服务器返回一个 XML 其中包含要显示的 HTML 文本 例如
  • 无加速结果的高斯消去法

    我正在开发一个 C 库 对于我自己来说 代码 https github com BattlestarSC matrixLibrary git 来处理矩阵函数 这主要是一项学习 实践活动 我的挑战之一是有效地获取矩阵的行列式 由于我目前的尝试
  • CodeIgniter 框架上有类似 MasterPages 的东西吗?

    我是 Code Igniter 的新手 我想知道是否有任何东西可以像 NET 上的 MasterPages 一样工作 我还想知道我应该在哪里保存我的公共文件 例如脚本 样式和图像 问候 并预先感谢您 主视图未内置到框架中 要获得类似的效果
  • SSL证书是否绑定到服务器IP地址?

    我们在两个不同的物理办公地点有两个不同的 LDAP 提供商 当我将笔记本电脑连接到一个位置并 从端口检索 在 Websphere 6 1 中 以导入 ldap 提供者的 SSL 证书时 我可以毫无问题地对相应的 ldap 进行身份验证 如果
  • 此 COUNT MySQL 语句中出现未知列错误?

    错误是 where 子句中的未知列 num SELECT COUNT AS num books bookid FROM bookgenre has books WHERE num gt 10 GROUP BY books bookid 我究
  • 如何从 Google Places API 获取国家/地区代码

    我正在尝试使用 HTML 5 GeoLocation 来获取经度和纬度 然后使用 Google Maps API获取国家 地区代码该经度 纬度 有没有更简单的方法从 google place api 获取国家 地区代码 我从这个链接找到了解
  • Ruby 中的正则表达式负向后查找似乎不起作用

    制作一个参数解析器 我想将一个字符串分割成一个数组 其中分隔符是 除非前面有 这意味着字符串 foo ba r arg 应该导致 foo ba r arg 我正在尝试使用这个正则表达式
  • 如何使用用户凭据在 Powershell 中运行 Start-Process?

    我有一个 Windows 服务 Jenkins 它运行一个需要以特定用户身份运行命令的脚本 我尝试这样做 但它不起作用 secpasswd ConvertTo SecureString myPassword AsPlainText Forc
  • Admob 广告未展示 - Android

    我的广告根本不显示 我认为我已正确遵循文档 但它们仍然不会显示 该程序基本上是一个网络视图 我希望广告显示在底部 这是我的布局文件
  • 即使在“keep class”标志之后,ProGuard 也会混淆类。影响 Android WebView 行为

    我正在使用 ProGuard 来混淆我的 Android 应用程序 我也在用WebView显示一个网页 HTML 演练页面 其中包含一个可关闭该按钮的按钮WebView Javascript中有一个函数可以回调closeWalkthroug
  • 在appdata文件夹中创建sql server压缩文件

    我正在开发一个简单的软件 它首先使用实体 框架代码和sql server Compact 4 目前此设置有效 如果 sql server 压缩文件尚不存在 实体框架将创建该文件 数据库的路径是从存储在 app config 文件内的连接字符
  • Google OAuth 登录卡在加载同意屏幕上

    我的应用程序使用 Google Drive API 来备份用户文件 我想从头开始测试我的应用程序登录 因此我从我的 Google 帐户设置中手动撤销了该应用程序 但当我再次登录时 我在选择我的 Google 帐户后卡住了加载同意屏幕 见下文
  • 算法:将列表从一种顺序重新排列为另一种顺序的最佳方法?

    EDIT 我不确定我原来的问题是否足够清楚 我需要一种算法来计算将数组从一个顺序重新排列为另一个顺序的最小移动序列 众所周知 两个数组将包含相同的元素 没有重复 并且具有相同的长度 例如 reorder d a c b e a b c d