- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定以下二维数组:
6 8 11 17
9 11 14 20
18 20 23 29
24 26 29 35
n = 4
),使用需要
O(n² log(n²)) = O(n² log(n))
的快速排序是微不足道的。对二维数组进行排序。我的问题是我们可以在
O(n²)
中对此进行排序吗? ?
6 8 9 11
11 14 17 18
20 20 23 24
26 29 29 35
最佳答案
是的,我们可以在 O(n^2) 时间内对其进行排序。
减少对一维数组进行排序
让我们首先证明这个对二维数组进行排序的新问题(使得每一行、每列和从左上到右下对角线都排序)可以简化为对 n^2 的一维数组进行排序的问题元素。
假设我们有一个由 n^2 个元素组成的已排序的一维数组。通过将前 n 个数字设置为第一行,然后将接下来的 n 个数字设置为第二行,我们可以轻松地将其重新排列为一个已排序的 n x n 数组,并重复直到我们用完数组。
因此,给定一个包含 n^2 个数字的二维数组,我们可以在 O(n^2) 时间内将其转换为一维数组,对该数组进行排序,然后在 O(n^2) 时间内将其转换回所需的二维数组.因此,如果我们能在 O(n^2) 中找到一个一维数组的排序算法,我们就可以在 O(n^2) 时间内等效地解决这个新问题。
在线性时间内对一维数组进行排序
鉴于此,我们只需要提供线性时间排序。即给定 n^2 个元素,在 O(n^2) 时间内对它们进行排序。方便的是,您可以使用多种算法来完成此操作,例如 counting sort或 radix sort ,尽管它们确实带有各种警告。然而,假设给定要排序的项目数量,数值范围是合理的,这些排序将在线性时间内运行。
因此,给定 nxn 数组中的 n^2 个元素,这个二维排序问题可以在 O(n^2) 时间内简化为一维排序问题,然后可以在 O(n^2) 中使用各种线性时间排序算法来解决时间。因此,总的来说,这个问题可以在 O(n^2) 时间内解决。
使用比较排序进行排序
继评论中的讨论之后,下一步是问:比较排序怎么样。比较排序是有益的,因为它可以让我们避免前面提到的计数和基数排序的警告。
然而,即使有这些附加信息,线性时间比较排序在实践中也是不太可能的,因为这需要我们在 O(1) 时间内计算每个数字的最终位置。我们知道使用比较排序是不可能的。
让我们考虑一个小例子:最初在第 1 行第 2 列的数字的最终排序位置应该是什么?我们知道它必须是第 2...n 列中的第一个数字。但是,我们不知道它相对于第 1 列中的数字(第 1 行第 1 列中的数字除外)属于何处。
通常,对于原始正方形中的任何数字,我们不确定其最终排序位置相对于其左下角的所有数字和右上角的数字。需要 O(log_2(n)) 次比较才能找到每个数字的相对位置,并且需要定位 O(n^2) 个数字。这种不确定性使我们无法在实践中实现线性时间排序。
但是我们拥有的额外信息应该能让我们实现一些加速。例如,我们可以调整 merge sort到这个问题。在标准的归并排序中,我们首先将原始数组分成两半并重复,直到我们得到保证排序的大小为 1 的数组,
然后我们反复合并这些子数组,直到我们有一个单一的数组。对于 n^2 个元素,我们必须创建一个具有 log_2(n^2) 层的二叉树,并且每一层都需要 O(n^2) 的时间来合并。
使用问题设置中的附加信息,我们不必拆分数组,直到它们的大小为 1。相反,我们可以从 n 个长度为 n 的排序数组开始,然后从那里开始合并。这将我们必须合并的层数减半,并为我们提供了 O(n^2 log_2(n)) 的最终运行时间。
结论
在实践中,这个额外的信息允许比较排序的一些加速,使我们能够实现 O(n^2 log_2(n)) 的运行时间。
但是为了实现在 O(n^2) 时间内运行的线性时间排序,我们必须依赖于诸如计数或基数排序之类的算法。
关于complexity-theory - 运行时复杂度 : sorting 2d array where each row, 列和对角线是否排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62015704/
首先我要说的是,我主要是一名 iOS 开发人员,最近才开始探索全栈开发的惊心动魄的冒险。我是 PHP 和 MySQL 的新手。话虽如此,我有一个问题,我希望需要一个直接的解决方案。 我正在为一个拥有预
我的表单上有 GridEx 对象并且... 我想用 for...next 循环在其中添加一些项目。实际上我找不到任何方法来添加带有自定义数据的新行。 我想在那个 GridEx 对象中选择一个特定的行。
我有以下数据框 df1 = DataFrame([['OBJ1', 10, 'BX', 'pool1', 'OBJ2'],['OBJ2', 0, '', '', 'OBJ1'],['OBJ3', 1
所以我有以下成员(member)历史表 User_ID | Start date | End Date | Type(0-7) | ---------------------------
我不擅长sql。我查看了 stackoverflow,但似乎对我没有任何用处。所以,我正在寻求帮助。是否可以根据行中的第一个字段将 2 行合并为 1 行。 我在 mysql 中执行此操作。我将展示示例
我了解 flex sm、md、lg 列的概念,但不了解应用于行的概念。弹性行有什么作用? sm、md、lg 尺寸应用于弹性行时意味着什么? 最佳答案 简答 - .row只是网格的容器 col .然而,
我遇到麻烦的地方 我相信我需要使用 COUNT;但是,我不知道如何将一行与同一列中的每一行进行比较,然后计算有多少行比相应行少/便宜。提前谢谢您! 这是我试图解决的官方问题: “使用示例架构,编写一条
我有以下 3 个相关表 Schools Departments Classes --------------- ------------------ --
我有代码: g, g_err = data[:, 4:6].T 我不知道[:, 4:6]的含义 尤其是第一个: .T 表示转置吗? 最佳答案 您有一个名为 data 的二维矩阵,您的代码从第一维获取所
我在行单击上附加了一个事件,在行内的复选框更改上附加了一个事件。 如何防止首先触发行单击? $(document).on('click', 'table tr', function() { con
我有一个场景,我需要连接两个 SQL 表并且正在为如何做而苦恼。假设在表 A 中我有这个: ColA ColB ColC ColD 45 55 17 45 45
我用谷歌表格记录我们俱乐部的出席率。该表格链接到另一个谷歌表格,因此可以自动创建一个名字列表,并按字母顺序排序。在这张表格中,我还根据我们所做的活动,在人的名字旁边手动输入点数。。问题是,由于姓名列表
这个问题在这里已经有了答案: What is a NullPointerException, and how do I fix it? (12 个回答) 5年前关闭。 编辑:我正在使用此代码读取 Ex
我是 R 的初学者。我希望你能帮助我解决我的问题。我的数据集中的文件名包含大量信息。我必须提取这些信息来创建单独的变量。 首先我使用 splits <- t(as.data.frame(strspli
假设我有一个 CSR 格式的矩阵,将一行(或多行)设置为零的最有效方法是什么? 下面的代码运行得很慢: A = A.tolil() A[indices, :] = 0 A = A.tocsr() 我不
我遇到了一个相当复杂的问题。我有一个包含三行的数据框:id、info 和 rownum。数据如下所示: id info row 1 a 1 1 b 2
我正在阅读learnjsdata.com并遇到了这种不熟悉的 JavaScript 语法。语法如下: lookupIndex[row[lookupKey]] = row; 有人知道这里发生了什么吗?我
我有一个表格,收集每周足球比赛的结果。 根据每场比赛的结果,我根据 ID 为玩家输入 3、1 或 0 分,具体取决于他们是赢、平还是输。 id Name A1 B1 C1 A2 B2
我有一个 mysql 表: 在表1中,我有3列:Bidang、Keahlian、Nilai。在 saran 列的表结果中,我想根据 bidang 组合 keahlian,但如果 nilai > 0,则
我有一个看起来像这样的表 | ID | item1 | item 2 | | 1 | A1 | B1 | | 2 | A2 |
我是一名优秀的程序员,十分优秀!