zoukankan      html  css  js  c++  java
  • merge 实现

      今天写了个小程序,做两个已经从小到大排序好的数据的merge。

    要求: listA = (1, 3, 5, 10); listB = (4, 6, 12);listA 和listB都是排序由小到大的列表,元素个数不限。

    写代码将listA 按照由小到大的顺序合并,不去重。

    第一轮代码如下:

    def merge(A, B):
        if len(A)==0:
            return B
        if len(B)==0:
            return A
    
        result = []
        for itemA in A:
            for itemB in B:
                if itemA < itemB:
                    print itemA, "<", itemB,  '--------->insert itemA:', itemA
                    result.append(itemA)
            
                else:
                    print itemA, ">", itemB, '--------->insert itemB:', itemB
                    result.append(itemB)        
                    
        return result
    
    
    Alist = [1, 2, 3, 7, 8]
    Blist = [4, 6]
    
    print merge(Alist, Blist)
                    

    可想而知,得到的结果自然是不正确的。 

    问题呢? 很显然,break 跳出了循环后,再进入的时候,还会从B的开始查起,这样有的元素就会多次被查到,而在insertB的时候,也会丢掉A的循环。最终的数据结果是,A的元素丢失,B的元素多次被插入。

    那如何争取解决问题呢?

    下面这个代码写的很繁复,但是实现了基本功能。

    def merge(A, B):
        if len(A)==0:
            return B
        if len(B)==0:
            return A
    
        result = []
        lenA = len(A)
        lenB = len(B)
        currentAIndex = 0
        currentBIndex = 0
       
        for i in range(currentAIndex, lenA):
            for j in range(currentBIndex, lenB):
                if A[i] < B[j]:
                    print A[i], "<", B[j],  '--------->insert itemA:', A[i]
                    result.append(A[i])
                    currentAIndex = currentAIndex+ 1
                    break
                else:
                    print A[i], ">", B[j], '--------->insert itemB:', B[j]
                    result.append(B[j])
                    currentBIndex = currentBIndex+ 1
    
        while currentAIndex <lenA:
            result.append(A[currentAIndex])
            currentAIndex = currentAIndex+ 1
    
        while currentBIndex <lenB:
            result.append(B[currentBIndex])
            currentBIndex = currentBIndex+ 1
    
                    
        return result
    
    
    Alist = [1, 7, 8]
    Blist = [4, 6, 9, 10]
    print merge(Alist, Blist)
  • 相关阅读:
    WebAPP与原生APP的交互设计区别
    [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!
    [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
    Spark On YARN
    Spark Runtime概述
    Spark内核概述
    Spark Streaming 官网上提到的几点调优
    Spark RDD(Resilient Distributed Dataset)
    Spark 中的 checkpoint
    Spark HA 配置中spark.deploy.zookeeper.url 的意思
  • 原文地址:https://www.cnblogs.com/xiami303/p/4504699.html
Copyright © 2011-2022 走看看