zoukankan      html  css  js  c++  java
  • 利用二分查询实现的链表

    最近在研的项目有效率问题,自己动手写了个二分查询为基础的链表。记得上次写数据结构的东西大约在3年前,我还算个程序员么?
    实现过程是痛苦的,实现结果是相当的丑陋的。。。容器类库用多了的必然结果,不上进的典型程序员。。。最终,还是找到角落里的《数据结构》。
    。。。。。。。。。。。。
    我还是总结下吧:
    程序中为什么我想不到呢?没有书里面实现优美?那些东西是没想到,而且很重要的呢?
    1、 from、to的初始化值的选定
    2、二分查询主要是区间的查询,总是开始--结束,怎么保证始终有效

    总结如下:
    查询算法结构主要如下:
    1、循环结束条件
    2、循环变量(循环结束条件里的值)的变迁:可不要有死循环
    3、开始状态的设定:初始值的设定
    4、抽象的归纳:每次循环都应该是一个模式(如递归)

    public class BinaryList
        {
            private List<IComp> _list = new List<IComp>();
            /// <summary>
            /// 找到最小匹配区间
            /// </summary>
            /// <param name="obj">要查询(插入)的对象</param>
            /// <param name="from">区间开始索引</param>
            /// <param name="to">区间结束索引</param>
            /// <returns>是否空</returns>
            private bool FindIntv(IComp obj, out int from, out int to)
            {
                //初值保证,能遍历所有元素
                from = -1;
                to = _list.Count;

                if ( _list.Count < 1 )
                {
                    return false;
                }

                //找到最小区间
               
                while (from + 1 != to)
                {
                    int middle = (from + to) / 2;
                    if (obj.IsBefore(_list[middle]))
                    {
                        to = middle;
                    }
                    else
                        from = middle;
                }

                //保证区间有效:当只有一个元素时

                if ( from < 0)
                {
                    from = 0;
                }

                if ( to >= _list.Count)
                {
                    to = _list.Count - 1;
                }

                return true;
            }

            public void Add( IComp obj )
            {
                int from,to;
                if( FindIntv(obj, out from, out to) )
                {
                    if (obj.IsBefore(_list[from]))
                    {
                        _list.Insert(from, obj);
                    }
                    else if (obj.IsBefore(_list[to]))
                    {
                        _list.Insert(to, obj);
                    }
                    else
                        _list.Insert(to + 1, obj);
                }
                else
                {
                    _list.Add(obj);
                }
              

            }

            public bool IsExist( IComp obj )
            {
                int from, to;
                if( FindIntv(obj, out from, out to))
                {
                    return obj == _list[from] || obj == _list[to];
                }

                return false;
            }

            public void Display()
            {
                foreach (IComp s in _list)
                    Console.WriteLine(s.ToString());
            }
        }

  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    问题清单
    2020软件工程个人作业06
    2020软件工程作业05
    2020软件工程作业00
    2020软件工程作业04
    2020软件工程作业03
  • 原文地址:https://www.cnblogs.com/YangYu/p/1530831.html
Copyright © 2011-2022 走看看