首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行和列排序矩阵中的k个最小元素

行和列排序矩阵中的k个最小元素
EN

Code Review用户
提问于 2017-04-18 12:50:31
回答 1查看 374关注 0票数 4

在行和列排序元素中查找kth最小元素:

例子:矩阵<矩阵row+1矩阵<矩阵 mat= 1 2 21 11 23 25 31 36 41

我编写了以下代码,如何提高可读性并提高其复杂性:

代码语言:javascript
复制
import heapq
def kth_smallest(k, mat):
    m = len(mat)
    n = len(mat[0])
    hp = []
    for i in xrange(n):
           heapq.heappush(hp,[mat[0][i], 0, i])
    heapq.heapify(hp)
    while k >1:
        x = heapq.heappop(hp)
        if x[1]+1 < m:
            heapq.heappush(hp,[mat[x[1]+1][x[2]], x[1]+1, x[2]])           
        heapq.heapify(hp)
        k-=1

    return hp[0][0]


print kth_smallest(8, [[1,10,12],[2,11,21], [3,31,45]])
EN

回答 1

Code Review用户

发布于 2017-04-18 13:08:25

一个非常简单的方法是希望列表添加和标准Python排序是快速的(后者对于部分排序的数组尤其快速)。

在这种情况下,您可以使用sum函数的第二个参数作为和的起点,并使用:

代码语言:javascript
复制
def kth_smallest(k, mat):
    entries = sorted(sum(mat, []))
    return entries[k - 1]

在我的机器上,给出的例子是,对于小矩阵,这比您的解决方案要好,但是对于较大的矩阵,则会分解。然而,理解起来要容易得多。

代码语言:javascript
复制
+----+---------------------------------------+----------+---------+--------------+
| k  |                matrix                 | Graipher | Harsha  | Janne Karila |
+----+---------------------------------------+----------+---------+--------------+
|  1 | [[1,10,12],[2,11,21], [3,31,45]]      | 1.34 µs  | 1.61 µs | 1.07 µs      |
|  8 | [[1,10,12],[2,11,21], [3,31,45]]      | 1.22 µs  | 5.94 µs | 3.72 µs      |
|  8 | [[1,10,12, 25, 38, 42, 51],           | 2.43 µs  | 12 µs   | 5.55 µs      |
|    | [2,11,21, 35, 48, 52, 67],            |          |         |              |
|    | [3,31,45, 47, 58, 63, 72],            |          |         |              |
|    | [4, 32, 46, 48, 59, 64, 73]]          |          |         |              |
| 25 | [range(i, i+50) for i in range(50)]   | 286 µs   | 220 µs  | 42.4 µs      |
| 25 | [range(i, i+100) for i in range(100)] | 1.8 ms   | 455 µs  | 79.3 µs      |
+----+---------------------------------------+----------+---------+--------------+

就风格而言,只有少数几个违反PEP8的地方,所有操作人员周围都缺少空格.

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/161101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档