【发布时间】:2021-02-28 14:06:56
【问题描述】:
我正在参加算法竞赛,并且正在尝试优化我的代码。也许我想做的是愚蠢和不可能的,但我想知道。
我有这些要求:
- 可以包含 4 种不同类型的物品的库存。此库存不能包含超过 10 件商品(包括所有类型)。有效库存示例:1 / 1 / 1 / 0。无效库存示例:11 / 0 / 0 / 0 或 5 / 5 / 5 / 0
- 我有一些收据可以消耗或添加物品到我的库存中。这 recepe 不能添加或消费超过 10 个项目,因为库存 不能超过 10 个项目。有效收据示例:-1 / -2 / 3 / 0. 无效recepe示例:-6 / -6 / +12 / 0
现在,我将库存和收据存储为 4 个整数。然后我可以执行一些操作,例如:
- ApplyRecepe: Inventory(1/1/1/0).Apply(Recepe(-1/1/0/0)) = Inventory(0/2/1/0)
- CanAfford: Iinventory(1/1/0/0).CanAfford(Recepe(-2/1/0/0)) = False
我想知道是否可以(如果可以,如何)将库存/收据的 4 个值存储到一个整数中,并对其执行比比较/添加 4 个更快的操作我现在正在做的整数。
我想到了类似这样的库存:
int32: XXXX(第一类项数)-YYYY(第二类项数)-ZZZ(第三类项数)-WWW(第四类项数)
但我有两个问题:
- 我不知道如何处理可能的负值
- 在我看来,这比仅添加 4 个整数要慢得多,因为我必须对库存和收据进行移位以获得我想要的值,然后继续添加。
【问题讨论】:
-
像这样的位打包很少会产生更快的代码。为什么不只是四个独立的
int8_ts? -
您正在寻找 矢量化 又名 array programming.
-
这被称为SIMD,尽管您的用例似乎太简单而无法真正利用它。
-
bitpacking 主要是为了存储,一旦你要对它进行计算,你大多需要解压它。
-
仅供参考:我在SO: Atomic operations - C 中提出了类似的想法,但出于不同的原因:使多个计数器的修改成为原子。