- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这更像是一个算法问题,假设您有一个类似 4 6 2 4 9 5 23 54 33 的模式,最后三个数字是连胜。我想知道如何以编程方式(或数学方式)检测到这一点。
目前我正在考虑使用比方说过去 3 个值的尾随平均值来扫描数据。如果新值 (23) 突然比该平均值高很多,我们就会标记可能出现连续上垒的开始。后面的数字不应与它相差太多,以认为热连胜仍在继续。
这听起来像是一种有效的方法吗?是否已经存在解决此类问题的算法?
最佳答案
好的。我已经试过了,但在我开始之前我必须说这不是基于任何算法(至少:我没有故意将它基于现有算法)并且它有一些缺陷(它没有说明对于负数/零)并且可能有许多边缘情况需要解决。
为了找到两个数字之间的距离以确定它们是否相似,我找到了 this simple formula :
Percent difference = (L - S) / S
其中 L 代表“最大”,S 代表“最小”。
首先,输出 5 个 50 个值在 1 到 40 之间的随机序列:
7 14 34 13 4 1 3 34 10 29 25 32 28 39 14 32 37 30 21 27 28 27 26 25 27 34 15 36 3 29 32 35 8 32 20 5 30 4 17 16 27 35 7 34 7 37 14 31 38 23
Possible hot streak (treshold 0,95): 27 - 28 - 27
Possible hot streak (treshold 0,95): 28 - 27 - 26
Possible hot streak (treshold 0,95): 27 - 26 - 25
9 16 17 3 11 19 28 10 25 10 25 6 31 21 37 29 24 35 20 9 2 34 14 6 1 33 21 31 19 30 20 23 38 19 21 16 19 6 21 1 17 20 18 7 30 22 4 26 37 17
Possible hot streak (treshold 0,8): 17 - 20 - 18
14 18 12 30 22 15 3 12 3 18 38 36 31 35 30 3 8 13 39 21 11 19 14 19 31 22 16 7 15 19 29 34 33 2 16 3 12 8 37 6 14 7 4 4 2 21 29 22 17 27
Possible hot streak (treshold 0,8): 38 - 36 - 31
Possible hot streak (treshold 0,8): 36 - 31 - 35
Possible hot streak (treshold 0,8): 31 - 35 - 30
Possible hot streak (treshold 0,8): 29 - 34 - 33
14 31 26 16 6 35 5 32 38 39 38 35 36 24 29 4 3 29 20 28 31 39 15 34 8 4 15 11 18 11 32 34 30 28 5 38 9 17 35 21 37 19 9 37 8 18 11 20 14 37
Possible hot streak (treshold 0,95): 38 - 39 - 38
18 39 3 29 36 14 17 32 9 3 20 33 15 28 8 5 6 9 19 30 35 25 34 38 30 13 30 17 27 29 33 35 36 20 33 33 31 2 31 30 21 16 9 33 2 5 4 21 30 3
Possible hot streak (treshold 0,9): 33 - 35 - 36
Possible hot streak (treshold 0,9): 33 - 33 - 31
我采用的想法非常简单:给定一个项目列表,对其进行迭代,从当前索引开始对前 3 个进行分组,然后查看它们是否在可接受的阈值范围内。如果是,请继续,直到找到当前阈值内的所有组合。如果没有与设置阈值的组合,则从阈值中减去 0.05(又名:更宽松)并重新开始。
需要注意的是,该算法基本上是在序列中搜索一组归一化的值。您可以通过 - 在运行算法后 - 计算被视为热连胜的 3 个值的总和来改进这一点,并在该阈值中取最大的值总和。这应该会给你最高的连胜纪录。
所以这个算法所做的是寻找条纹,您所要做的就是找到热条纹(这是微不足道的)。
还有一些方面可以改进,只采用周围值较低的序列,但这将取决于您希望算法走多远。
这种方法的一个好处是它已经部分做到了这一点(您会注意到序列通常位于整个数据集的较高部分),因为用于确定两个数字之间差异的公式。
值 3 和 2 将返回 0.5 的百分比差异,而值 30 和 29 将返回 0.03,因此算法会更快地选择后者。在这方面,您已经自动收集了热条纹,但它没有考虑周围的值以更加精确。
代码:
void Main()
{
for(int i = 0; i < 5; i++){
var list = GetList();
DisplayList(list);
GetHotStreaks(list);
}
}
private static Random rand = new Random();
private List<int> GetList(){
var list = new List<int>();
for(int i = 0; i < 50; i++){
list.Add(rand.Next(1, 40));
}
return list;
}
private void DisplayList(List<int> list){
for(int i = 0; i < list.Count; i++){
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
private void GetHotStreaks(List<int> list){
double treshold = 0.95;
bool found = false;
while(treshold > 0.0){
for(int i = 0; i < list.Count - 2; i++){
if(AreWithinRange(list[i], list[i + 1], list[i + 2], treshold)){
Console.WriteLine (string.Format("Possible hot streak (treshold {0}): {1} - {2} - {3}", treshold, list[i], list[i + 1], list[i + 2]));
found = true;
}
}
if(found){
Console.WriteLine ();
return;
}
treshold -= 0.05;
}
}
private bool AreWithinRange(int val1, int val2, int val3, double treshold){
return AreWithinRange(val1, val2, treshold) && AreWithinRange(val2, val3, treshold);
}
// http://www.oracle.com/webfolder/technetwork/data-quality/edqhelp/Content/processor_library/matching/comparisons/percent_difference.htm
private bool AreWithinRange(int val1, int val2, double treshold){
double max = Math.Max(val1, val2);
double min = Math.Min(val1, val2);
double pd = (max - min) / min;
//Console.WriteLine ("Values: val1: {0}\t val2: {1}\t PD: {2}\t T: {3}", val1, val2, pd, treshold);
return pd <= 1 - treshold;
}
关于algorithm - 如何检测数字模式中的热连胜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107092/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!