ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

4.8python如何求解最小三元组距离

2020-01-29 21:03:57  阅读:493  来源: 互联网

标签:ci Di python maxs 4.8 距离 三元组 ai minDist


题目描述:

已知三个升序整数数组 a[l], b[m], c[n],请在三个数组中各找出一个元素,使得组成的三元组距离最小。三元组距离的定义是:假设 a[i], b[j], c[k] 是一个三元组,那么距离为:
Distance=max(| a[i] - b[j] |,| a[i] - c[k]|,| b[j] - c[k] |)。
设计一个求最小三元组距离的最优算法。

方法:
最简单的方法是找出所有可能的组合,从所有可能的组合中找出最小距离,但是效率低下。
通过分析发现,当 a<= b <= c 时,此时它们的距离肯定为 D = c-a,此时就没有必要计算 b-a,c-b了。

  1. 蛮力法
  2. 最小距离法
  3. 数学运算法

1.蛮力法
分别遍历三个数组中的元素,对遍历到的元素分别求出它们的距离,然后按照距离的定义得出最小的距离。

代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/1/29 19:34
# @Author  : buu
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44321080
def maxx(a, b, c):
    maxs = b if b > a else a
    maxs = c if c > maxs else maxs
    return maxs


def miDistance(a, b, c):
    aLen = len(a)
    bLen = len(b)
    cLen = len(c)
    minDist = maxx(abs(a[0] - b[0]), abs(a[0] - c[0]), abs(b[0] - c[0]))
    i = 0
    while i < aLen:
        j = 0
        while j < bLen:
            k = 0
            while k < cLen:
                dist = maxx(abs(a[i] - b[j]), abs(a[i] - c[k]), abs(b[j] - c[k]))
                if dist < minDist:
                    minDist = dist
                k += 1
            j += 1
        i += 1
    return minDist


if __name__ == '__main__':
    a = [3, 4, 5, 7, 15]
    b = [10, 12, 14, 16, 17]
    c = [20, 21, 23, 24, 37, 30]
    print('min dist:', miDistance(a, b, c))

结果:
在这里插入图片描述
算法性能分析:

时间复杂度为O(lmn);
这种方法没有用到数组升序的特点。

2.最小距离法
假设当前遍历到这三个数组中的元素分别为 ai,bi,ci,且 ai <= bi <= ci,此时它们的距离肯定为 Di = ci - ai;那么接下来分如下三种情况讨论:
(1) 接下来如果求 ai,bi,ci+1 的距离,由于 ci+1 >= ci ,此时它们三元组的距离必为Di+1 = ci+1 - ai,显然 Di+1 >= Di ,所以 Di+1 不可能为最小距离。
(2) 接下来如果求 ai,bi+1,ci+ 的距离,由于 bi <= bi+1

  • 若 bi+1 <= ci ,此时它们三元组的距离仍为 Di = ci - ai
  • 若 bi+1 > ci , 此时它们三元组的距离必为Di+1 = bi+1 - ai,显然 Di+1 >= Di ,所以 Di+1 不可能为最小距离。

(3) 如果接下来求 ai+1,bi,ci 的距离,若 Di = | ci - ai | < ci - ai+1 ,此时它们的距离为 max(ci - ai+1,ci - bi),显然 Di+1 < Di ,所以 Di+1 有可能时最小距离。

综上,在求最小距离的时候只需要考虑第三种情况即可。具体实现思路:
从三个数组的第一个元素开始,首先求出它们的距离 minDist ,接着找出这三个数中最小数所在的数组,只对这个数组的下标往后移动一个位置,接着求三个数组中当前遍历元素的距离,如果比 minDist 小,则把当前距离赋值给 minDist ,依此类推,直到遍历完其中一个数组为止。
在这里插入图片描述
代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/1/29 19:49
# @Author  : buu
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44321080
def maxx(a, b, c):
    maxs = b if b > a else a
    maxs = c if c > maxs else maxs
    return maxs


def minn(a, b, c):
    mins = a if a < b else b
    mins = c if c < mins else mins
    return mins


def minDistance(a, b, c):
    aLen = len(a)
    bLen = len(b)
    cLen = len(c)
    minDist = 2 ** 32
    minElem = 0
    i, j, k = 0, 0, 0
    while True:
        curDist = maxx(abs(a[i] - b[j]), abs(a[i] - c[k]), abs(b[j] - c[k]))
        if curDist < minDist:
            minDist = curDist
        minElem = minn(a[i], b[j], c[k])
        if minElem == a[i]:
            i += 1
            if i >= aLen:
                break
        elif minElem == b[j]:
            j += 1
            if j >= bLen:
                break
        else:
            k += 1
            if k >= cLen:
                break
    return minDist


if __name__ == '__main__':
    a = [3, 4, 5, 7, 15]
    b = [10, 12, 14, 16, 17]
    c = [20, 21, 23, 24, 37, 30]
    print('min dist2:', minDistance(a, b, c))

结果:
在这里插入图片描述
算法性能分析:
此方法最多只需要对三个数组分别遍历一遍,所以时间复杂度为O(l+m+n);

end

布欧不欧 发布了76 篇原创文章 · 获赞 2 · 访问量 2538 私信 关注

标签:ci,Di,python,maxs,4.8,距离,三元组,ai,minDist
来源: https://blog.csdn.net/weixin_44321080/article/details/104109382

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有