- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题是在面试中被问到的。
你有一个小整数数组。你必须将它们全部相乘。你不必担心溢出你有足够的支持。您可以做什么来加快机器上的乘法运算?
在这种情况下,多次添加会更好吗?
我建议使用分而治之的方法进行乘法运算,但面试官并不以为然。最好的解决方案是什么?
最佳答案
以下是一些想法:
多线程分而治之:将输入分成 n 个大小为 b 的不同 block ,然后递归地将每个 block 中的所有数字相乘。然后,递归地将所有 n/b block 相乘。如果您有多个内核并且可以并行运行其中的一部分,那么您总体上可以节省大量时间。
Word-Level Parallelism:假设您的数字都以某个数字 U 为界,该数字恰好是 2 的幂。现在,假设您要将 a、b、c 和 d 相乘。从计算 (4U2a + b) × (4U2c + d) = 16U4ac + 4U2 开始ad + 4U2bc + bd。现在,请注意这个表达式 mod U2 只是 bd。 (因为 bd < U2,我们不需要担心 mod U2 步骤搞砸了)。这意味着如果我们计算此乘积并将其取模 U2,我们将返回 bd。由于 U2 是 2 的幂,这可以通过位掩码来完成。
接下来,注意
4U2ad + 4U2bc + bd < 4U4 + 4U4 + U2 < 9U4 < 16U4
这意味着如果我们将整个表达式除以 16U4 并向下舍入,我们最终将只返回 ad。这种除法可以通过位移来完成,因为 16U4 是 2 的幂。
因此,通过一次乘法,您可以通过应用后续的移位和位掩码来取回 ac 和 bd 的值。一旦有了 ac 和 bd,就可以直接将它们相乘得到 abcd 的值。假设位掩码和位移位比乘法更快,这会将所需的乘法次数减少 33%(这里是两个而不是三个)。
希望这对您有所帮助!
关于algorithm - 将大量小数相乘的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23090917/
int SIZE = 512; p = new BigInteger(SIZE, 15, new Random()); q = new BigInteger(SIZE, 15, new
我正在寻找一种方法来扩展以下形式的逻辑表达式(在字符串中): “(A或B)和((C和D)或E)” 在Python中生成所有正集的列表,即 ['A and C and D', 'A and E', 'B
我正在从 MySQL 数据库中提取一组数字,并尝试对它们进行一些简单的数学运算来计算要放入发票中的总价格,但 PHP 不配合。我认为这可能是类型强制问题,因此我尝试添加一些 intval 和 floa
给定一个包含多列字典的数据框,我如何将数据框中的键相加和/或相乘以获得一列 A B {"ab":1,
我有 2 个 UIImageView - 一个在底部并显示默认图像(如照片)- 在第二个 UIImageView 上您可以在其中绘制。 我想从两个图像创建一个 UIImage,并将其保存为新图像。 我
我有一项作业,并且我已经写完了前两部分,但我只是不知道如何找到最小的数字。我应该提到它在 jFrame (gui) 中。它应该看起来像这样: 假设我有一个数字列表 (10 5 8 7 4 9),我想知
我是 python 的新手,但是有没有办法将矩阵与 0 和符号相乘?例如,见下文: import sympy as sym import numpy as np teams=np.matrix([[1
让我们为变量赋值: thisIsANumberVariable % +5 #adds 5 to thisIsANumberVariable thisIsANumberVariable [1] 8 th
我正在尝试以下操作: Eigen::SparseMatrix bijection(2 * face_count, 2 * vert_count); /* initialization */ Eigen
我必须创建一个没有 * 或 / 运算符的乘法函数。我已经做了这样的方法。 for(int i=0; i < number1; i++){ result += number2; } System
让我们为变量赋值: thisIsANumberVariable % +5 #adds 5 to thisIsANumberVariable thisIsANumberVariable [1] 8 th
这个问题已经有答案了: Convert String to double in Java (14 个回答) 已关闭 9 年前。 我的代码有问题。所以我知道我不能将我所拥有的乘以字符串,但我真的不知道有
我正在尝试以下操作: Eigen::SparseMatrix bijection(2 * face_count, 2 * vert_count); /* initialization */ Eigen
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我需要将矩阵和 vector 相乘。 为了实现这一点,我编写了一个带参数的函数: float** M 尺寸的最大值:m x n。 float* V 长度为 n 的 vector 。 float* R
我正在尝试找出一个好的循环展开来将两个矩阵相乘。 例如,如果我们想要对 NxN 矩阵求和: void SumMatrix(int *M, int n, int *result) { int i,
如果我创建一个像这样的字符串 mutiples=[1,2,3,4,5] 我希望能够使用 .forEach 将它们相乘,我该怎么做?我最好的猜测是: var total=0 multiples=[1,2
我试图将 price(1-3) 标签中的数据乘以 counterValue 以显示所选每个选项的价格 到目前为止,我的代码可以将counterValue 乘以所选选项Btn(1-3) 的因子 被选中
我有两个大小相同的 3-D 数组 a 和 b np.random.seed([3,14159]) a = np.random.randint(10, size=(4, 3, 2)) b = np.ra
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我是一名优秀的程序员,十分优秀!