- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在从 Euler Project Problem 513, Integral median 解决这个问题:
ABC is an integral sided triangle with sides a≤b≤c. mc is the median connecting C and the midpoint of AB. F(n) is the number of such triangles with c≤n for which mc has integral length as well. F(10)=3 and F(50)=165.
Find F(100000).
分析:
a <= b <= c <= n == 100000
abs(a-b) < c < a+b
Mc = sqrt(2 * a^2+ 2 * b^2 - c^2) / 2
wikipedia Mc
是整数所以 2 * a^2+ 2 * b^2 - c^2
应该是一个完美的正方形并且可以被 4 整除。代码:
#include <stdio.h>
#include <math.h>
#define N 100000
#define MAX(a,b) (((a)>(b))?(a):(b))
void main(){
unsigned long int count = 0;
unsigned long int a,b,c;
double mc;
for (a = 1; a <= N; a++) {
printf("%lu\n", a);
for (b = a; b <= N; b++)
for (c = MAX(b, abs(b-a)); c <=N && c < a+b; c++){
mc = sqrt(2 *a *a + 2 * b * b - c * c)/2.0;
if (mc-(unsigned long)mc == 0)
count++;
}
}
printf("\ncpt == %lu\n", count);
}
问题:
它适用于小型 n
但是解决方案的复杂度太高了,我假设是O(n^3)
(我错了吗?)n = 100000
需要几天时间.
我怎样才能通过数学或算法的方式改进它?
更新
我得到了那些建议:
a
的计算能力外面b
/c
b
的循环和功率外面c
环形。这略微提高了性能。c
不能奇怪。然后 a
和 b
必须具有相同的奇偶校验。这将性能提高了 4 倍。O(N^5/2)
一个基本的解决方案,可以实现O(N^2)
通过使用 O(N^2)
的内存。我还没有测试。最佳答案
由于这是一个欧拉计划问题,您应该能够在现代计算机上用大约一分钟的计算时间来完成它。他们并不总是坚持这一点,但这表明如果常量不是太差,运行时间 k*n^2
或 k*n^2*log(n)
可能没问题,但可能不是 k*n^2.5
或 k*n^3
。
正如 SleuthEye 评论的那样,边 c 必须是偶数,否则平方根的内部必须是奇数,因此取平方根除以 2 不能得到整数。
您可以将等式简化为 4(mc^2+(c/2)^2) = 2(a^2+b^2)
。
这是一种方法:创建左右两个字典。对于每个,让键为等式那一侧的可能值,并让值成为产生键的 (mc,c/2)
或 (a,b)
对的列表。对于正确的字典,我们只需要考虑 a
和 b
的奇偶性相同的地方,以及 1<=a<=b<=n
的地方。对于左边,我们只需要考虑 1<=c/2<=n/2
和 1<=mc<=sqrt(3)/2 n
以来的 4mc^2 = 2a^2+2b^2-c^2 <= 3b^2 <=3n^2
。
然后遍历可能的键,并比较每个字典中值的元素,找到兼容的 ((mc,c/2),(a,b))
对的数量,其中 b <= c < a+b
。这个内部步骤不是常数时间,但列表的最大和平均长度不会太长。将 n 写为两个平方和的方法大致对应(最多单位)高斯整数中将 n 分解的方法,正如最大的 number of factors of an integer 不会增长太快一样,高斯整数也是如此。此步骤对于任何 O(n^epsilon)
都需要 epsilon>0
时间。因此,对于任何 O(n^(2+epsilon))
,总运行时间为 epsilon>0
。
在实践中,如果内存不足,您可以构建部分字典,其中的键被限制在特定范围内。这也可以很好地并行化。
关于c - 如何优化我的代码以查找所有可能的积分三角形的所有积分中位数,其中 a <= b <= c <= 100000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29992720/
基本上在 excel 中,我想要一个表格,就像下面右边给出的那个(我的数据规模比给出的例子大很多),它有每个主题的中位数,每个条件(例如 TADA、TADP、TPDA , TPDP)。理想情况下,我会
我有一个大小为5000 * 5000的矩阵,其90%的值为0。是否有现成的解决方案可用来计算排除“0”后该矩阵的均值,中位数? 一种粗制解决方案是将所有0更改为NA并使用 median(x, na.
这个问题已经有答案了: Mean per group in a data.frame [duplicate] (8 个回答) 已关闭 9 年前。 我有一个数据框,详细记录了客户花了多少钱,如下所示:
这是我的代码,用于打印所有职业的平均值和中位数。 occupation_lst = ['ALL OCCUPATIONS', 'MANAGEMENT', 'Chief executives', 'Gen
我的 csv 文件中有一个数据集,如下所示: teacher student student grade Jon marin
如何在 C 中不使用数组的情况下找到一组数字的平均值、中位数?问题不是找到平均值或中位数的方法,而是如果不允许使用数组,如何存储一组数字并对它们执行一些操作? 最佳答案 一个有趣的问题。 关键是找到一
我正在使用 SQL Server 2008 如果我有这样的表: Code Value ----------------------- 4 240 4 299 4 21
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我需要从输入文件中查找平均值、中位数、众数和范围。 [input file has the numbers{60,75,53,49,92,71}] 我不知道如何打印范围内的计算结果或计算众数。 这很糟
这个问题已经有答案了: Division of integers in Java [duplicate] (7 个回答) 已关闭 7 年前。 public static double calcMed
当我输入 1,2,3 时我的中位数计算有问题我的中位数是 = 44 我不知道为什么 double wynik = 0; string x1 = textBox1.Text; string[] tab
我的中位数 3 实现在这里运行不正常。我必须为媒体随机选择 3 个数字,这是我的代码,请帮助我。 #include"stdafx.h" #include #include using namespa
我有一个文件,其中有如下几秒钟的数字: 0.01033 0.003797 0.02648 0.007583 0.007491 0.028038 0.012794 0.00524 0.019655 0.
是否有任何函数(作为数学库的一部分)可以计算 mean 、中位数、众数和范围来自一组数字。 最佳答案 是的,似乎确实有第三个库(Java Math 中没有)。出现的两个是: http://opsres
我目前正在尝试从具有两个条件的一系列数据中提取中位数。本质上相当于下面的 AVERAGEIFS(),我工作得很好。 AVERAGEIFS(): =AVERAGEIFS(Analysis!$F:$F,A
我有一个 pandas 数据框,看起来像这样: 给定行中的每个值要么是相同的数字,要么是 NaN。我想计算数据框中所有两列组合的平均值、中位数和获取计数,其中两列都不是 NaN。 例如,上述数据帧的结
我有以下数据: [4.1, 4.1, 4.1, 4.2, 4.3, 4.3, 4.4, 4.5, 4.6, 4.6, 4.8, 4.9, 5.1, 5.1, 5.2, 5.2, 5.3, 5.3, 5
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
一组整数作为输入。您必须返回该集合的子集,以便该子集的均值 - 中位数最大。 示例 1 输入 {1,2,3,4} 输出 {1,2,4} 例子2 输入 {1,2,2,3,3} 输出 {2,2,3} 最佳
我是一名优秀的程序员,十分优秀!