Python分割一个序列,并使两个序列直接的差值最小

算法题:

提供一个序列,完成对这个序列的分割。要求分割后的两个序列彼此差值最小

def find(arr):
    arr.sort()
    if not arr:
        return ([], [])
    elif len(arr) == 2:
        return (arr[:1], arr[1:])
    elif len(arr) == 1:
        return (arr[0:], [])
    else:
        max_num = arr[-1]
    max_two_num = arr[-2]

    max_list, min_list = find(arr[:-2])

    max_list.append(max_two_num)
    min_list.append(max_num)

    if sum(max_list) > sum(min_list):
        return (max_list, min_list)
    else:
        return (min_list, max_list)

arr = [1, 46, 3, 8, 6, 4561, 4642, 45, 8, 9, 155, 1784, 100]

a1, a2 = find(arr)
print(a1, a2)
# 返回结果
# [1, 3, 8, 45, 46, 1784, 4561] [6, 8, 9, 100, 155, 4642]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 Python 代码实现霍夫曼编码: ```python from collections import Counter import heapq import math def huffman_encoding(letters, radix): freq_dict = Counter(letters) heap = [[wt, [sym, ""]] for sym, wt in freq_dict.items()] heapq.heapify(heap) while len(heap) > 1: lo = heapq.heappop(heap) hi = heapq.heappop(heap) for pair in lo[1:]: pair[1] = '0' + pair[1] for pair in hi[1:]: pair[1] = '1' + pair[1] heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:]) encoding_dict = dict(sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))) max_len = max([len(code) for code in encoding_dict.values()]) n = math.ceil(math.log(len(encoding_dict), radix)) for sym, code in encoding_dict.items(): encoding_dict[sym] = code.zfill(max_len) encoding_dict[sym] = ''.join([chr(int(encoding_dict[sym][i:i+n], radix) + ord('0')) for i in range(0, max_len, n)]) return encoding_dict def huffman_decoding(encoded_text, encoding_dict, radix): max_len = max([len(code) for code in encoding_dict.values()]) n = math.ceil(math.log(len(encoding_dict), radix)) decoded_text = "" while encoded_text: for sym, code in encoding_dict.items(): if encoded_text.startswith(code): enc_sym = encoded_text[:len(code)] for i in range(0, max_len, n): dec_sym = int(enc_sym[i:i+n], radix) - ord('0') decoded_text += chr(dec_sym) encoded_text = encoded_text[len(code):] break return decoded_text if __name__ == '__main__': letters = input("请输入O符号的N重序列信源:") radix = int(input("请输入R进制:")) encoding_dict = huffman_encoding(letters, radix) print("编码结果:", encoding_dict) encoded_text = ''.join([str(ord(sym) - ord('0')).zfill(math.ceil(math.log(radix, 10))) for sym in letters]) decoded_text = huffman_decoding(encoded_text, encoding_dict, radix) print("解码结果:", decoded_text) ``` 代码说明: - `huffman_encoding` 函数用于对输入字符串进行霍夫曼编码。输入参数 `letters` 是一个字符串,表示信源的字符集;`radix` 是进制数,用于将编码后的字符串转化为数字。 - `huffman_decoding` 函数用于对编码后的字符串进行解码。输入参数 `encoded_text` 是编码后的字符串,`encoding_dict` 是编码字典,`radix` 是进制数。 - 在 `huffman_encoding` 函数中,首先统计 `letters` 中每个字符出现的频率,并将其放入一个小根堆中。然后依次从堆中取出两个出现频率最小的字符,将它们合并成一个节点,该节点的权重为两个字符出现频率的和。将新节点重新放回堆中,并在新节点上构建编码字典。最后将编码字典中的编码字符串转化为数字,并填充到最大长度。 - 在 `huffman_decoding` 函数中,首先将编码字符串根据编码字典进行解码。解码过程中,根据编码字典中最长编码的长度和进制数,将编码后的字符串分割成若干段,每段转化为一个数字并减去 `'0'` 的 ASCII 码值,得到原始字符的 ASCII 码值,再将其转化为字符。最后将所有字符拼接成一个字符串返回。 注意:由于 Python 中的字符串是不可变对象,因此在 `huffman_encoding` 函数中,需要使用 `pair[1] = '0' + pair[1]` 和 `pair[1] = '1' + pair[1]` 来更新编码字符串。如果直接使用 `pair[1] += '0'` 和 `pair[1] += '1'`,则只会在函数内部改变 `pair[1]` 的值,不会改变 `encoding_dict` 中对应字符的编码字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值