回答
真的应该有很多角度来担心它。但是当然,你可以击败O(n^2)
排序数组。使用指针a
和b
。首先找到从a
开始的最大角度的b
,并将其存储到best
。然后重复提前a
一步并且步b
,直到它停止增加差异。您将遍历约150次的清单,以O(n)为界,因为b
无法跨越a
。所以它不会比分类花费的时间更糟糕。
我认为你已经在这里得到了正确的答案,但它可以做更多的解释,将它从“排序并选择第一个和最后一个”的建议中分离出来。例如,你可以证明为什么对于一个有序数组'A',如果'A [j]'与'A [i]'有最大的角度差,而'A [k]'与'A [ i + 1]'''k> = j'。这是真正阻止你必须通过O(n^2)对进行搜索的原因。 – beaker
如果角度为[0,180],则表示角度为正,如果角度为[-180,0],则表示角度为负。
扫描列表中,执行如下:
1结果的最大和最小正角度
2记录最大和最小负角度
3如果角度为正角度,将其转换(让它减去180 )到负角度,并用一些标记标记以指示它来自转换
对于#1,最大的差别就是最大的角度减去最小的角度。所以是#2。
对于#3,首先排序角度。从排序列表的末尾扫描。如果相邻的角度是不同种类的(一个来自转换,一个不是),然后计算差异。如果差异是有史以来最小的差异,请记录下来,并继续扫描。完成后,使用180-差值,并将结果作为差值#3。
现在你有3个差异,挑选最大的一个。我认为这是答案。
对于复杂性,所有扫描都是O(n)。对于分类,如果所有角度都是正值或负值,则根本不需要相位#3。如果需要阶段#3,我们可以让它有更少的角度。例如,如果列表的正面角度较小,我们可以将正面转换为负面,反之亦然。排序是O(nlgn),但我们可以有更小的n。
你也可以跳过转换,并有两个扫描仪:一个从正角开始,一个在负角开始。 – Teepeemm
从RW教程中得到了这个。
它与你想要的相反(返回最小的角度),但你可以调整它。
// Returns shortest angle between two angles,
// between -M_PI and M_PI
static inline CGFloat ScalarShortestAngleBetween(const CGFloat a, const CGFloat b)
{
CGFloat difference = b - a;
CGFloat angle = fmodf(difference, M_PI * 2);
if (angle >= M_PI)
{
angle -= M_PI * 2;
}
return angle;
}
这是错过了重点。 OP已经可以找到两个角度之间的差异(我们假设)。我们正在寻找最大的角度返回,希望没有经过所有成对转换的显而易见的'O(n^2)'过程。 – Teepeemm
- 1. Ruby - 查找子阵列之间的最大差异
- 2. 使阵列中的元素之间的差异最大化
- 3. 如何找到阵列和阵列阵列之间的差异
- 4. 两个子阵列元素之间的最大绝对差异
- 5. 找到numpy阵列之间最小差异的位置
- 6. 高度与最大/最小高度之间的差异
- 7. 查找两个多维双列阵之间的差异
- 8. 2角之间的最小差异
- 9. 查找阵列中具有最大度数的最小子阵列的长度
- 10. 阵列中两个数字之间的最小绝对差异
- 11. 找到向量中元素之间的最大差异
- 12. 行之间的最大差异
- 13. 阵列差异之间的区别
- 14. 两个角度之间的最小差异?
- 15. 算法:找出阵列中两个元素之间最接近的差异
- 16. 在PostgreSQL中查找两个大表之间的差异
- 17. 如何找到Mysql中两列之间的最小差异?
- 18. 查找字符串之间的差异
- 19. SQL Server查找行之间的差异
- 20. SQL查找两行之间的差异
- 21. Excel:查找日期之间的差异
- 22. 查找小时之间的差异
- 23. 查找列之间的时间差
- 24. MySQL - 查找同一列中的字段之间的差异
- 25. 找到两行之间的最大差异
- 26. 显示阵列之间最大差值为列表
- 27. C:二维阵列和正常阵列相同的大小之间的差异
- 28. 查找AmCharts中两个点序列值之间的差异?
- 29. PHP:检查的两个multidim阵列之间的差异
- 30. 查找阵列中最大的元素
聪明吗?你的意思是像排序他们,然后采取[1]和[N] –
数据是圆形的,180 = -180。所以找到最小和最大是不够的。 – wmil
先转换,然后排序。 –