c#二(三)分查找的两种方式

其实;两种方式的实现结果一样,却体现出了不同的思考过程;

地中方式,是在一个while循环中,每次从中间找,不断的去改变low 和 high的 位置,然后求他们的中间位置,知道low=high=0;如果还没有知道值,就直接返回-1;

        /// <summary>
        ///  二分查找方式
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static int BinaySearch(int[] arr, int target)
        {
            int len = arr.Length;
            int low = 0;
            int high = len - 1;
            //一个while循环就搞定了;
            while (low <= high)
            {
                int middleIndex = (low + high) / 2;
                int middleValue = arr[middleIndex];
                if (middleValue == target)
                {
                    return middleIndex;
                }
                else if (target > middleValue)
                {
                    //searching in right;
                    low = middleIndex + 1;
                }
                else
                {
                    //searching in left;
                    high = middleIndex - 1;
                }
            }
            //没有找到直接就return
            return -1;
        }

然后,是利用我们递归的方式来实现的;如果没有找到,子改变地址,然后recursionly的去searching

        /// <summary>
        ///  这样我们的二分查找的递归方式就出来了;
        ///  这个方式是我们用递归的方式来实现的;
        ///  不同的代码实现过程,体现了你不同的思考过程;
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="low"></param>
        /// <param name="high"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static int RecursionlyBinaySearch(int[] arr, int low, int high, int target)
        {
            int l = low;
            int h = high;
            if (l > h)
                return -1;
            int middleIndex = (l + h) / 2;
            int middleValue = arr[middleIndex];
            if (middleValue == target)
            {
                //stop finding;
                return middleIndex;
            }
            else if (target > middleValue)
            {
                // finding in right;
                return RecursionlyBinaySearch(arr, middleIndex + 1, high, target);
            }
            else
            {
                //finding in left;
                return RecursionlyBinaySearch(arr, l, middleIndex - 1, target);
            }

        }

本来,想整一个第三种方式出来的;。。。。。。。。。。。只是本来;

第一种做法,有一个bug,你发现了吗????而且!!!非常不明显;

详细的,请看这里;

https://research.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html

这里还有更详细的介绍:

https://www.quora.com/Why-do-people-use-mid-low+-high-low-2-instead-of-low+high-2

 

ps:有我们的二分查找,当然就有我们的三分查找,四分,等等;如果再分的更细;就形成了我们一个个的查找,这样的意义并不带,因为,我们内部的查找是串行的,如果能够找到内部的查找是并行的;

那么;这样查找的意义才比较大;

 

总之,要做好区间的分割;同样的,我给出;两种实现方式;

第一种简单的while实现;

        /// <summary>
        ///  这个怎么去分呢???
        ///  分成了三个区间;
        ///  就是一个不断划分区间,然后进行查找的问题;
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="target"></param>
        public static int ArrayTernarySearch1(int[] arr, int target)
        {
            //开始;
            int len = arr.Length;
            int low = 0;
            int high = len - 1;

            while (low <= high)
            {
                //计算中间位置;
                int middle1Index = low + (high - low) / 3;
                int middle2Index = high - (high - low) / 3;
                //中间值;
                int middle1Vaule = arr[middle1Index];
                int middle2Vaule = arr[middle2Index];

                if (target <= middle1Vaule)  //做好区间分割;
                {
                    if (target == middle1Vaule)
                    {
                        return middle1Index;
                    }
                    else
                    {
                        high = middle1Vaule - 1;
                    }
                }
                else if (middle1Vaule < target && target <= middle2Vaule) //做好区间分割;
                {
                    if (target == middle2Vaule)
                    {
                        return middle2Index;
                    }
                    else
                    {
                        low = middle1Index + 1;
                        high = middle2Index - 1;
                    }

                }
                else if (target > middle2Vaule) //做好区间分割;
                {
                    low = middle2Index + 1;
                }

            }

            return -1;
        }

第二种递归实现;

        /// <summary>
        /// 递归实现;
        /// 加油,我们把这段时间,给熬过去;窝草你尼玛的比;
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="low"></param>
        /// <param name="high"></param>
        /// <returns></returns>
        public static int RecursionTernarySearch(int [] arr,int low,int high,int target)
        {

            if (low > high)
                return -1;

            int l = low;
            int h = high;

            if(l <= h)
            {
                int m1 = l + (h - l) / 3;
                int m2 = h - (h - l) / 3;

                int m1Value = arr[m1];
                int m2Value = arr[m2];

                if (m1Value == target)
                {
                    return m1;
                }
                if (m2Value == target)
                {
                    return m2;
                }

                //区间划分; 
                if (target < m1Value)
                {
                    RecursionTernarySearch(arr, low, m1 - 1, target);

                }
                else if (m1Value < target && target < m2Value)
                {
                    RecursionTernarySearch(arr, m1 + 1, m2 - 1, target);
                }
                else
                {
                    RecursionTernarySearch(arr, m2 + 1, high, target);
                }

            }

            return -1;
        }

        /// <summary>
        /// 这种方式的思路要清晰一些;
        /// 非常不错,我们一次性就成功的写正确的代码;
        /// 效果非常好;
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static int TernarySearch(int [] arr,int target)
        {
            int len = arr.Length;
            if (len < 0)
                return -1;
           int index=RecursionTernarySearch(arr, 0, len - 1,target);
            return index;
        }

 

当然,还有我们的四分;和五分。。。。但这样分下去,就没有多大的意义;

 

转载于:https://www.cnblogs.com/mc67/p/8297597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值