| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 463 人关注过本帖
标题:求助:C#中的二级索引查找如何实现?
只看楼主 加入收藏
peggy1986
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-15
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
求助:C#中的二级索引查找如何实现?
程序需要实现的功能如下:
将测试数据存储到字典中,字典为二级索引,如何实现索引查找?

图 8.2 一个主表和一个索引表的结构图
0       1      2      3
14     34     66     85
0       5      10     14
索引表

8  14  6   9   10  22  34  18  19   31   40  38  54  66  71  78  68  80  85
0  1   2   3   4   5   6   7   8    9    10  11  12  13  14  15  16  17  18
主表

      索引查找分两步进行。先确定待查找记录所在的子表,然后在子表中进行顺
序查找。比如,在图 8.2 中,现在要查找关键码为54 的记录。先将 54 依次与索
引表中每个记录的 data 域的值进行比较,由于 34<54<66,则若在主表中存在关
键码为 54 的记录,则该记录必定在主表的第 3 个子表中。由于相应的 link 域的
值为 10,所以,从主表的第11 个记录(数组的下标为10)开始进行顺序查找。
当比较到主表的第 13 个记录(数组的下标为12)时,关键码相等,说明主表中
有要查找的记录,则查找成功。当然,如果比较到第 15 个记录(因为索引表的
下一个记录的 link 域的值为 14)仍然不等,说明主表中不存在要查找的记录,
查找失败。
    性能分析:索引查找由索引表查找和子表查找两步完成。设 n个记录的顺序
表分为 m个子表,且每个子表均有t 个记录,则 t=n/m。这样,索引查找的平均
查找长度为: ASL=ASL索引表+ASL子表=(m+1)/2+(n/m+1)/2=(m+n/m)/2+1

    当主表中的记录个数非常多时,索引表本身可能也很大,此时可按照
的方法对索引表再建立索引表,这样的索引表称为二级索引表。同样的方法
还可建立三级索引表。二级以上的索引结构称为多级索引结构。
搜索更多相关主题的帖子: 结构图 如何 
2013-05-15 22:42
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
收藏
得分:20 
程序代码:
class Program
    {
        private static string[] arrIndex;
        private static int[] arrMain;

        static void Main(string[] args)
        {
            //初始化数据
            initTable();
            Console.WriteLine("请输入要查找的值:");
            string value = Console.ReadLine();
            int v = int.Parse(value);
            //根据要查找的值,查出索引
            string str = findIndex(v);
            int star = 0;
            int end = 0;
            if (str.IndexOf(",") > 0)
            {
                string[] arrStr = Regex.Split(str, ",");
                star = int.Parse(arrStr[0]);
                end = int.Parse(arrStr[1]);
            }
            else
            {
                star = int.Parse(str);
                end = arrMain.Length - 1;
            }
            bool flag = false;
            //根据索引,在主表中查找数据
            for (int i = star; i <= end; i++)
            {
                if (arrMain[i] == v)
                {
                    Console.WriteLine("已找到查询的值,对应主表下标[" + i + "]");
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                Console.WriteLine("未在主表中找到要查询的值");
            }
            Console.ReadKey();
        }

        /// <summary>
        /// 初始化数据
        /// </summary>
        public static void initTable()
        {
            initIndexTable();
            initMainTable();
        }

        /// <summary>
        /// 初始化索引表
        /// </summary>
        public static void initIndexTable()
        {
            arrIndex = new string[] { "14,0", "34,5", "66,10", "85,14" };
        }

        /// <summary>
        /// 初始化主表
        /// </summary>
        public static void initMainTable()
        {
            arrMain = new int[19] { 8, 14, 6, 9, 10, 22, 34, 18, 19, 31, 40, 38, 54, 66, 71, 78, 68, 80, 85 };
        }

        /// <summary>
        /// 查找值所对应的索引
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string findIndex(int value)
        {
            string str = "";
            for (int i = 0; i < arrIndex.Length - 1; i++)
            {
                string[] arrTemp = Regex.Split(arrIndex[i], ",");
                string[] arrTemp1 = Regex.Split(arrIndex[i + 1], ",");
                if (value <= int.Parse(arrTemp[0]))
                {
                    str = arrTemp[1] + "," + arrTemp1[1];
                    break;
                }
                else if (value > int.Parse(arrTemp[0]) && value <= int.Parse(arrTemp1[0]))
                {
                    if (i < arrIndex.Length - 2)
                    {
                        string[] arrTemp2 = Regex.Split(arrIndex[i + 2], ",");
                        str = arrTemp1[1] + "," + arrTemp2[1];
                        break;
                    }
                    else
                    {
                        str = arrTemp1[1];
                        break;
                    }
                }
            }
            if (str == "")
            {
                string[] arrTemp = Regex.Split(arrIndex[arrIndex.Length - 1], ",");
                str = arrTemp[1];
            }
            return str;
        }
    }
2013-05-18 15:12
快速回复:求助:C#中的二级索引查找如何实现?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017950 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved