【问题标题】:How to sort two vectors in one in Python?如何在 Python 中将两个向量合二为一?
【发布时间】:2018-09-01 20:12:23
【问题描述】:

我需要编写一个函数,它接收两个已经按升序排序的数组(A[] 和 B[]),它的函数分配一个数组 C[],恰好是 A 和 B 的大小之和,并交错C[] 中 A[] 和 B[] 的元素,所以数组 C[] 是按升序排列的。尽可能高效地编写函数。不是用 Bubble 方法也不是 Insertion 加入数组和对数组 C[] 排序。

示例: A[] = { 1, 3, 6, 7} 和 B[] = {2, 4, 5},新向量为 C[] = { 1, 2, 3, 4, 5, 6, 7}

我的代码没有停止运行,我做错了什么?

def union(v1, v2):
    c = [0, 0, 0, 0, 0, 0, 0, 0]
    auxv1 = 0
    auxv2 = 0
    i = 0
    j = 0
    k = 0
    while i < len(v1)-1:
        auxv1 = v1[i]
    while j < len(v2)-1:
        auxv2 = v2[j]
    while k < len(c):
        if auxv1 < auxv2:
            c[k] = auxv1
            i += 1
            k += 1
        else:
            c[k] = auxv2
            j += 1
            k += 1
    if i == len(v1)-1 and j == len(v2)-1:
        return c

【问题讨论】:

  • 我们不能使用嵌套循环
  • while i &lt; len(v1) - 1 停止应该怎么办?
  • 在 Python 中你不能比list(sorted(A + B)) 更快,因为 Python 的排序速度非常快 (en.wikipedia.org/wiki/Timsort)。您的代码存在许多问题,从前两个 while 循环开始,不会更改循环变量(i 和 j),因此将永远运行......
  • 您希望我们调试您的代码,还是提供新的解决方案?
  • @bereal 你读过 timsort 链接吗?它可能会进行两次运行检查和一次合并,并且将是 O(n) - 它也将是 C 代码(并且是正确的;-)

标签: python arrays python-3.x


【解决方案1】:

您可以只遍历这两个列表并将c 的元素添加到列表ab,根据哪个更小。
一个例子如下。

c=[]
i = j = 0

while True:
    if j == len(b):
        c+=a[i:]
        break
    elif i == len(a):
        c+=b[j:]
        break
    elif a[i] < b[j]:
        c.append(a[i])
        i+=1
    else:
        c.append(b[j])
        j+=1

相对于两个列表的长度,这种方法的时间复杂度为linear

【讨论】:

  • 感谢您的解决方案。但是,当我输入 2 个长度相同的列表时,程序会报错(“列表索引超出范围 - 第 5 行”)。
【解决方案2】:

@newbie 写了一个非常清晰的算法,也非常快——它进行的列表操作的数量正好等于结果中的元素数量,即线性。

但是,您可以通过查看一个列表中的值的运行来找到一种亚线性算法,该算法应该插入到另一个列表中的下一个值之前。

我猜这可以在运行量较大的较长列表上执行得更快。(与往常一样,在性能方面,您需要使用自己的数据对其进行测试)。

a = [1,3,6,7]
b = [2,4,5,9,11,12,13,14,15,16]
c = []

a1 = a2 = b1 = b2 = 0
alen = len(a)
blen = len(b)
clen = alen + blen

while a2 + b2 < clen:
    print "processed:", a2 + b2
    if b2 == blen:    # done with b..
        c += a[a1:]   # just append rest of a
        break         # and we're done
    else:
        # find indexes a1..a2 such that all items come before the next b
        next_b = b[b2]
        while a2 < alen and a[a2] < next_b:
            a2 += 1
        c += a[a1:a2]   # extend c with the chunk we've found
        a1 = a2

    if a2 == alen:    # we're done with a
        c += b[b1:]   # just append rest of b
        break         # and we're done
    else:
        next_a = a[a2]
        while b2 < blen and b[b2] < next_a:
            b2 += 1
        c += b[b1:b2]
        b1 = b2

print c

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 2015-12-30
    • 2023-02-02
    • 2019-10-01
    • 2022-12-01
    • 2015-07-04
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多