开发者社区 问答 正文

用于在数百个列表之间进行元素智能操作的通用算法

我的任务是为一个项目编写一个算法。基本上,我扫描数据以获得唯一的项并将它们的位置存储在一个数组中。所以我得到了可变长度的多个数组。现在我必须对所有这些数组和它们的元素进行元素操作。请注意,这些总是被排序的(如果这很重要的话)

a = [0, 7, 13, 18]
b = [1, 2, 8, 10]
c = [0, 3, 5, 6, 7]

当前的解决方案是一个非常基本的循环解决方案,我循环遍历每个数组,并将其元素与每个其他数组及其元素进行比较。它只适用于少量的数组,并且,正如您可以想象的那样,当我有许多具有自己的数组/列表的唯一项时,它就不能很好地工作。

def add(a, b):
    result = []
    for i in range(len(a)):
        for j in range(len(b)):
            result.append(a[i] + b[j])
    return result


a = [0, 7, 13, 18]
b = [1, 2, 8, 10]
c = [0, 3, 5, 6, 7]
total_unique_items = [a, b, c]
calc = []


for i in range(len(total_unique_items)):
    for j in range(i+1, len(total_unique_items)):
        calc.append(add(total_unique_items[i], total_unique_items[j]))
    print(calc)

我知道有像zip这样的python解决方案,但是我的老师要求这里有一个通用的独立于语言的解决方案。 我不太确定如何处理这个问题。一种方法是使用树或图这样的数据结构并遍历它?另一种方法是在循环的第i次迭代中对数组的所有第i个元素执行操作。这样,主循环将运行最长数组的长度。我只是真的很困惑,我很想知道我应该走的方向。 问题来源StackOverflow 地址:/questions/59382875/generic-algorithm-for-element-wise-operation-between-hundreds-of-lists

展开
收起
kun坤 2019-12-27 16:58:38 427 分享 版权
阿里云 AI 助理回答

理解你的问题后,看起来你想要一个高效的方法来对多个已排序数组执行元素级操作(比如加法),而不依赖于特定语言的特性如Python的zip。考虑到这一点,我们可以设计一个更通用且效率更高的算法。这里的关键是利用这些数组已经排序的事实。

算法思路

  1. 合并排序数组:首先,可以考虑将所有数组合并成一个大的有序数组,同时记录每个元素来自哪个原始数组。这可以通过优先队列(最小堆)实现,每次从各个数组头部取出最小值加入结果,并记录其来源。

  2. 元素级操作:一旦有了这个合并后的有序数组,就可以遍历它,对于相同位置的元素(由于已排序,它们自然会相邻或重叠),执行所需的运算。因为数组是有序的,所以处理逻辑相对直接。

  3. 存储结果:根据运算结果和元素的来源信息,重新组织数据到新的数组中。

示例伪代码

# 假设有一个函数可以合并并标记来源
def merge_and_tag(arrays):
    # 实现细节略,使用优先队列等方法合并数组并记录元素来源

# 假设这是合并并标记后的结构简化表示
merged = merge_and_tag([[0, 7, 13, 18], [1, 2, 8, 10], [0, 3, 5, 6, 7]])

# 元素级操作函数,这里以加法为例
def element_wise_operation(merged_data, operation=lambda x, y: x + y):
    result = []
    current_source = merged_data[0]['source']
    current_list = [merged_data[0]['value']]
    
    for item in merged_data[1:]:
        if item['source'] == current_source:
            current_list.append(item['value'])
        else:
            # 对当前列表应用操作
            result.append(operation(*current_list))
            current_source = item['source']
            current_list = [item['value']]
    
    # 处理最后一个列表
    result.append(operation(*current_list))
    
    return result

# 应用操作
result = element_wise_operation(merged)

请注意,上述伪代码仅提供了一个概念性的解决方案框架,实际实现时需要根据具体需求调整。例如,merge_and_tag函数的具体实现可能涉及复杂的数据结构操作,而element_wise_operation则需根据实际操作逻辑进行调整。

阿里云产品建议

虽然这个问题更多地涉及到算法设计,但如果你在处理大规模数据集时遇到性能瓶颈,可以考虑使用阿里云的产品和服务来加速计算过程:

  • Elastic Compute Service (ECS):如果需要额外的计算资源来运行你的算法,ECS提供了灵活、可扩展的云计算服务。
  • Function Compute:如果你的任务可以分解为无状态的函数,Function Compute能提供事件驱动的计算服务,按需付费,适合处理突发性大计算量任务。
  • MaxCompute:对于大数据处理场景,MaxCompute是一个完全托管的PB级数据仓库服务,支持SQL查询及自定义编程模型,适合进行大规模数据处理和分析。

不过,基于你的描述,优化算法本身可能是最直接有效的解决途径。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答