小明数学考了优良中差?——二分法在区间统计的应用

简介: 前提:我的区间是用[,)计算的,集合已经升序排列好了。 /// /// /// /// /// /// /// /// ...

前提:我的区间是用[,)计算的,集合已经升序排列好了。

        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <param name="list"></param>
        /// <param name="low"></param>
        /// <param name="high"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        public static Tuple<int, int> BinarySearchRecursive(int data, IEnumerable<int> list, int low, int high, Tuple<int, int> left, Tuple<int, int> right)
        {

            int mid = (high + low) / 2;
            if (data >= left.Item2 && data <= right.Item2 && (right.Item1 - left.Item1 == 1))
            {
                return new Tuple<int, int>(left.Item2, right.Item2);
            }
            if (data >= list.ElementAt(list.Count() - 1))
            {
                //右边界
                return new Tuple<int, int>(list.ElementAt(list.Count() - 1), int.MaxValue);
            }
            if (data < list.ElementAt(0))
            {
                //左边界
                return new Tuple<int, int>(int.MinValue, list.ElementAt(0));
            }
            if (list.ElementAt(mid) > data)
            {
                return BinarySearchRecursive(data, list, low, mid - 1, left, new Tuple<int, int>(mid, list.ElementAt(mid)));
            }
            else if (list.ElementAt(mid) < data)
            {
                return BinarySearchRecursive(data, list, mid + 1, high, new Tuple<int, int>(mid, list.ElementAt(mid)), right);
            }
            //恰好和数组元素匹配的处理
            return new Tuple<int, int>(list.ElementAt(mid), list.ElementAt(mid + 1));
        }

有点恶心。不过测试通过就好啦。得到区间后其余就容易了,不过这个方法调用的时候有特别的技巧。那是作为递归结束的条件而特别那样的。

        static void Main(string[] args)
        {

            //var list = new List<int>() { 0, 50, 60, 80, 100 };
            var list = new List<int>() { 0, 50, 60, 800, 999 };
            Random r = new Random();

            int s = -50;
            var v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);

            s = 0;
            v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);

            s = 50;
            v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);

            s = 88;
            v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);

            s = 999;
            v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);

            s = 1000;
            v = Class1.BinarySearchRecursive(s, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
            Console.WriteLine("随机数:{0}区间[{1},{2})", s, v.Item1, v.Item2);
            for (int i = 0; i < 50; i++)
            {
                var a = r.Next(-50, 1200);
                v = Class1.BinarySearchRecursive(a, list, 0, list.Count, new Tuple<int, int>(1, int.MaxValue), new Tuple<int, int>(0, int.MinValue));
                Console.WriteLine("随机数:{0}区间[{1},{2})", a, v.Item1, v.Item2);
            }
            Console.ReadKey();
        }

  写的比较水,但是总结一下递归的要点应该就是把一些结果作为参数回传自身,收束的条件能够清晰的话,那问题就迎刃而解了。在这里我收束的条件是:这个数值>left并且<right并且left和right索引的差为1

  

 

目录
相关文章
|
设计模式 缓存 编译器
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
670 5
|
7月前
|
算法 关系型数据库 测试技术
WHQL微软驱动签名方案,让驱动程序在Windows系统流畅运行
WHQL认证(Windows徽标认证)是微软设立的严格测试标准,旨在确保驱动程序的兼容性、稳定性和互通性。本文介绍了三种WHQL微软驱动签名方案:单系统签名、多系统签名和硬件兼容性测试方案,分别满足不同开发商的需求。通过WHQL认证,不仅能消除Windows安装警告,提升用户体验,还能获得“Designed for Windows”徽标授权,入列全球Windows Catalog及HCL产品表,提升品牌权威性和采购优先权。此外,访问微软OCA可获取错误反馈,助力产品质量改进。选择合适的签名方案,让驱动在Windows系统中流畅运行!
|
11月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
190 4
|
10月前
|
编解码 监控 安全
远程软件怎么选?ToDesk、向日葵、Parsecd、TeamViewer评测结果公布
在全球化和数字化转型加速的背景下,选择一款高效稳定的远程控制软件成为许多个人用户和企业的核心需求。本文将对比四款热门远程控制软件——向日葵、ToDesk、Parsecd和TeamViewer,从连接速度、功能丰富度、安全性和易用性等多个维度进行评测。
1796 6
|
机器学习/深度学习 人工智能 安全
通义千问开源的QwQ模型,一个会思考的AI,阿里云百炼邀您第一时间体验
Qwen团队推出新成员QwQ-32B-Preview,专注于增强AI推理能力。通过深入探索和试验,该模型在数学和编程领域展现了卓越的理解力,但仍在学习和完善中。目前,QwQ-32B-Preview已上线阿里云百炼平台,提供免费体验。
3896 0
|
编解码 网络架构
802.11a 标准的数据速率是多少?
【8月更文挑战第24天】
725 0
|
网络协议 Unix 应用服务中间件
Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇
Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇
1016 1
|
前端开发 开发工具 git
[巨详细]使用HBuilder-X启动uniapp项目教程
【6月更文挑战第6天】使用HBuilder-X启动uniapp项目教程 先用HBuilder-X打开本地的uniapp项目
2316 0
|
机器学习/深度学习 人工智能 计算机视觉