【问题标题】:Algorithm for removing entries from an array, by removing "middlest" items?通过删除“中间”项从数组中删除条目的算法?
【发布时间】:2018-07-25 22:47:00
【问题描述】:

给定一个长度为 n 的项目列表,其中想要的项目的最大数量是 mm < n,其中列表中最有价值/最有用的项目是最远的项目从任何其他项目。如何从列表中删除项目以将列表大小减小到 m

  • 例如,对于带有m == 2[ a, b, c, d, e ],我们将得到[ a, e]

  • 例如,对于带有m == 3[ a, b, c, d, e ],我们将得到[ a, c, e ]

  • 例如,对于带有m == 4[ a, b, c, d, e ],我们将得到[ a, b, c, e ][ a, c, d, e ]。 (任何一个答案都是有效的;但应该只返回一个,最好是确定性地返回。)

注意:我正在概括一个真正的问题,即从视频中选择具有代表性的帧。代码将用python编写。

【问题讨论】:

  • 首先,[ a, b, c, d, e ] 是指['a', 'b', 'c', 'd', 'e'],还是别的什么意思? “最远”是什么意思?您是否想到了某种距离函数,例如abs(ord(x) - ord(y))?如果是这样,是否保证这些值按排序顺序排列?你能给我们一些例子,说明你想要的输出值不是线性增加的吗?或者您只是最小化 indexes 之间的距离,而不是跳过的 values 之间的距离?还是……?

标签: python arrays algorithm


【解决方案1】:

使用大小约为(n-1)/(m-1) 的步长遍历列表,其中“about”在那里是因为我们不能落在非整数上。

def representatives(l, m):
    num, den = len(l)-1, m-1
    return [l[i * num // den] for i in range(m)]

这里,结果的元素i取自输入的元素i*(n-1)//(m-1),其中//是楼层划分。

【讨论】:

    【解决方案2】:

    收藏c

    sparse_list = c[::len(c)//(m-1)]
    

    这将返回一个步长为len(c)//(m-1) 的列表(注意整数除法)。

    例如:

    c = list(range(50))
    m = 5
    c[::len(c)//(m-1)] # [0, 12, 24, 36, 48]
    

    它不是很完美,因为它适用于精确的间距,但它又快又简单(而且性能很好)。

    【讨论】:

    • 哇!我以前从未见过:: 语法!太棒了
    猜你喜欢
    • 2021-10-19
    • 2021-10-03
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多