为啥我的合并函数给出奇怪的答案?
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 < len1 and rfirst < 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.concatenate
和np.sort
应该这样做吗?
是的,它只是纯粹的排序意义,但我需要像上面那样实现它,这样我就可以添加一个计数器来跟踪对两个 numpy 数组进行的每个比较,这是我的最终目标。
我刚刚尝试过,它适用于您使用 Merge([5,6,9],[1,2,3]) 的方式,但如果列表颠倒了它仍然给出一个错误。 ```合并([1,2,3],[5,6,9])```以上是关于为啥我的合并函数给出奇怪的答案?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的函数 if/else if/else if 语句返回相同的答案?