为啥我的合并函数给出奇怪的答案?

Posted

技术标签:

【中文标题】为啥我的合并函数给出奇怪的答案?【英文标题】:Why is my Merge function giving weird answers?为什么我的合并函数给出奇怪的答案? 【发布时间】:2022-01-07 10:43:41 【问题描述】:

我刚刚使用 numpy 数组做了一个简单的合并函数。代码如下,应该是公平的 简单,是不是我没有正确实现数组?

import numpy as np

def Merge(leftlist, rightlist):
    len1 = len(leftlist)
    len2 = len(rightlist)
    lfirst = 0
    rfirst = 0
    merge  = 0
    newlist = np.empty(len1 + len2, dtype = int)
    while lfirst < len1 and rfirst < len2:
        if leftlist[lfirst] < rightlist[rfirst]:
            newlist[merge] = leftlist[lfirst]
            lfirst += 1
            merge += 1

        else:
            newlist[merge] = rightlist[rfirst]
            rfirst += 1
            merge += 1 
    
    return newlist

当我使用 Merge([5,6,9],[1,2,3]) 时,它返回:

数组([ 1, 2, 3, 173670400, 1667330163, 1701601125]),

而不是数组([1,2,3,5,6,9])。不知道有什么问题。

编辑:我应该提一下,在这种情况下,leftlist 和 rightlist 参数也是 numpy 数组。

【问题讨论】:

为什么不只是 sorted(leftlist+rightlist) 如果它们是列表或 np.sort(np.concatenate((leftlist, rightlist))) 如果它们是 numpy 数组? 因为while lfirst &lt; len1 and rfirst &lt; len2,修改一下 你应该分两步进行:合并然后排序,否则复杂性很快就会变得无趣 【参考方案1】:

当您运行Merge([5,6,9],[1,2,3]) 时,lfirst 保持为 0,因此永远不会在第一个元素之后读取leftlist(while 循环永远不会考虑如何处理具有更大值的列表)。您看到的随机元素是因为您首先创建了一个空数组。如果你一次又一次地运行Merge([5,6,9],[1,2,3]),最后3个元素每次都会改变。

我编辑了您的函数以找到您想要的结果(注意,仅当每个通过的列表都已排序时才会排序):

def Merge(left, right):
    leftlist, rightlist = [list(left), list(right)]
    comparisons = 0
    newlist = []
    
    while leftlist or rightlist:
        try:
            x = leftlist.pop(0) if leftlist[0] < rightlist[0] else rightlist.pop(0)
        except:
            x = leftlist.pop(0) if leftlist else rightlist.pop(0)
        newlist.append(x)
        comparisons += 1
                
    return np.array(newlist), comparisons

输出:

Merge([5,6,9],[1,2,3]) # (array([1, 2, 3, 5, 6, 9]), 6)

所以这里有 6 个比较。

【讨论】:

对不起@Manlai A,我应该提到leftlist和rightlist参数都是numpy数组,所以return sorted(leftlist+rightlist)会返回每个索引处的数字相加,对吗? @Apparent 所以只有np.concatenatenp.sort 应该这样做吗? 是的,它只是纯粹的排序意义,但我需要像上面那样实现它,这样我就可以添加一个计数器来跟踪对两个 numpy 数组进行的每个比较,这是我的最终目标。 我刚刚尝试过,它适用于您使用 Merge([5,6,9],[1,2,3]) 的方式,但如果列表颠倒了它仍然给出一个错误。 ```合并([1,2,3],[5,6,9])```

以上是关于为啥我的合并函数给出奇怪的答案?的主要内容,如果未能解决你的问题,请参考以下文章

为啥函数结果保存较晚?

为啥 sympy 在整合部分功率时给出不同/错误的答案?

为啥我的函数 if/else if/else if 语句返回相同的答案?

为啥没有出现答案?

为啥在 gcc 和 clang 上通过优化将大 double 转换为 uint16_t 会给出不同的答案

删除合并的分支给出“错误:分支 X 未完全合并......”