You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效存储与召回特定二进制输入组合的输出?

解决方案

针对你16路输入、仅存储1~n路导通组合并快速召回的需求,以下是几种高效实现方案:

一、组合数映射法(零冗余存储,纯计算定位)

这是最省内存的方案,核心是通过数学计算直接把输入组合映射到数组索引,无需额外存储组合信息。

操作步骤:

  1. 预存组合数前缀和:先算出1到n位导通的组合数及其前缀和,比如n=4时:

    • 1位导通:C(16,1)=16,前缀和S₁=16
    • 2位导通:C(16,2)=120,前缀和S₂=16+120=136
    • 3位导通:C(16,3)=560,前缀和S₃=136+560=696
    • 4位导通:C(16,4)=1820,前缀和S₄=696+1820=2516
      把这些前缀和存在一个小数组prefix_sum里,比如prefix_sum[0]=0, prefix_sum[1]=16, prefix_sum[2]=136, prefix_sum[3]=696, prefix_sum[4]=2516。
  2. 统计输入的导通位数k:对输入的16位二进制数,统计其中1的个数。如果k不在1~n范围内,直接判定无对应存储。

  3. 计算组合在k位组内的排名:把输入中1的位置按从小到大排序(比如低位到高位编号0~15),得到i₁<i₂<...<iₖ,用组合数公式计算该组合在k位导通序列中的排名(从0开始):

    rank = Σ(从m=1到k)C(iₘ, m) - 1
    

    注:可以预存所有C(16,m)的值(m从1到16),直接查表计算,避免实时计算组合数。

  4. 得到数组绝对索引:绝对索引 = prefix_sum[k-1] + rank,用这个索引直接从一维数组中取出输出值。

优势:

  • 完全没有冗余存储,仅需一个前缀和数组和组合数表
  • 计算速度快,统计1的个数是O(16)操作,组合数查表是O(k)操作

二、分层存储+二分查找(逻辑直观,维护简单)

把存储数组按导通位数分成n层,每层对应固定k值的组合,然后用二分查找定位:

操作步骤:

  1. 分层存储:

    • 第1层(k=1):存储所有1路导通的组合,共16个
    • 第2层(k=2):存储所有2路导通的组合,共120个
    • ...
    • 第n层(k=n):存储所有n路导通的组合,共C(16,n)个
      每层内部按二进制数值从小到大排序。
  2. 查找流程:

    • 统计输入的k值,不在1~n则返回无对应输出
    • 找到对应k层的数组,将输入转成16位整数,用二分查找找到该值在层内的位置
    • 结合层的起始索引(前缀和),得到一维数组的绝对索引,取出输出

优势:

  • 逻辑清晰,分层管理便于后续修改n值或调整组合规则
  • 二分查找时间复杂度低,比如k=4时仅需约11次比较

三、预计算哈希映射(实现最简单,查找最快)

预先把所有符合条件的组合(1~n路导通)的二进制值(用16位整数表示)作为键,数组索引作为值,存入哈希表。查找时直接通过输入值查哈希表得到索引,再取输出。

优化实现(用数组模拟哈希):

因为输入是16位整数,范围0~65535,可以直接用数组下标作为键,不需要传统哈希表结构,速度更快:

#include <stdint.h>

#define MAX_INPUT 65535
#define N 4
#define TOTAL_COMB (16 + 120 + 560 + 1820) // 2516

// 哈希映射数组:下标是输入值,值是对应的数组索引(0xFFFF表示无效)
uint16_t input_to_idx[MAX_INPUT + 1] = {0};
// 存储输出的一维数组
uint8_t output[TOTAL_COMB];

// 初始化函数
void init_mapping() {
    uint16_t current_idx = 0;
    for (uint16_t val = 1; val <= MAX_INPUT; val++) {
        int bit_count = __builtin_popcount(val);
        if (bit_count >= 1 && bit_count <= N) {
            input_to_idx[val] = current_idx;
            // 这里赋值对应的输出值,比如output[current_idx] = your_output;
            current_idx++;
        } else {
            input_to_idx[val] = 0xFFFF;
        }
    }
}

// 快速查找输出
uint8_t get_output(uint16_t input) {
    uint16_t idx = input_to_idx[input];
    return (idx != 0xFFFF) ? output[idx] : 0; // 0为默认无效值
}

优势:

  • 代码实现极简,几乎不需要复杂逻辑
  • 查找速度是O(1),平均情况下没有额外计算开销
  • 内存占用极小:数组input_to_idx仅128KB(65536*2字节),完全可忽略

内容的提问来源于stack exchange,提问作者Rune

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:25:24