查找

 

一.学习总结:

1.查找结构思维导图

 

 

2.查找学习体会

 查找是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)。查找表是同一类型的数据元素(或记录)构成的集合。查找表按照操作方式分为两大类:

 静态查找表:只作查找操作的查找表。

       顺序表查找、有序表查找、线性索引查找

 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个元素。

       二叉排序树、平衡二叉树(AVL树)、多路查找树(B树)

概念理解起来不难   更重要的是操作  要多加打代码  熟悉算法

二:PTA实验作业

题目一:是否是二叉搜索树

1.设计思路:

定义一个变量i  和数组变量a[]

int InorderTraversal(BinTree T){
      如果树的根节点不为空

     进行中序遍历 满足二叉搜索树的特点返回1,否则返回0
}
bool IsBST ( BinTree T ){

      定义一个变量b存储递归函数返回的值

      如果根节点为空则是二叉搜索树

      否则调用上面的递归函数,如果b=1,则为真,b=0,则为假
 
}

2.代码截图

3.PTA提交列表说明

 

开始编译错误是由于在代码的某一行分号打错,部分正确是因为没有考虑到根节点为空的情况

题目二:二叉搜索树中的最近公共祖先

1.设计思路:

 int find(Tree T,int u)  
{  
  如果T无孩子   返回0
  如果根节点的值等于u   返回1
  如果根节点的值小于u   返回u到右子树中找
  如果根节点的值大于u   返回u到左子树中找 
}  
  
int LCA( Tree T,  int u, int v )  
{  
    如果无T  则返回错误  
    如果没有在树中找到u或v   则返回错误
    如果u或v等于T    返回T的值
    如果u大于T且v小于T或者u小于T且v大于T      返回T的值
   如果u大于T   则在T的右孩子中找
    否则在T的左孩子中找
}   
2.代码截图

3.PTA提交列表

这个题其实我是不会做的,挣扎不出来,就去问了度娘,然后找到了很好的解决方法 ,此方法比较思路清晰简单易懂,就自己打了一遍,竟然过了,哈哈哈哈,开心

题目三:QQ帐户的申请与登陆

1.设计思路:

while(T--)
{
  定义命令符,QQ号,密码 
  如果是新用户
if(M.find(id)!=M.end())    已经存在该用户
else   存入新信息

如果是老用户

if(tmp==pass)     不存在该用户
else   错误
}

2.代码截图

3.PTA提交列表

经过大佬和度娘的指导,我深刻了解了map模拟算法,一直编译错误是因为选错编译器,改成C++就好了

三.PTA排名

四。阅读代码

 namespace HashSearch.CSharp
{
    class Program
    {
        //初始化哈希表
        static int hashLength = 7;
        static int[] hashTable= new int[hashLength];

        //原始数据
        static List<int> list = new List<int>() { 13,29,27,28,26,30,38 };

        static void Main(string[] args)
        {
            Console.WriteLine("********************哈希查找(C#版)********************\n");
            
            //创建哈希表
            for (int i = 0; i < list.Count; i++)
            {
                Insert(hashTable,list[i]);
            }
            Console.WriteLine("展示哈希表中的数据:{0}",String.Join(",",hashTable));

            while (true)
            {
                //哈希表查找
                Console.Write("请输入要查找的数据:");
                int data = int.Parse(Console.ReadLine());
                var result = Search(hashTable, data);
                if (result == -1) Console.WriteLine("对不起,没有找到!");
                else Console.WriteLine("数据的位置是:{0}", result);
            }
        }

        /// <summary>
        /// 哈希表插入
        /// </summary>
        /// <param name="hashTable">哈希表</param>
        /// <param name="data">待插入值</param>
        public static void Insert(int[] hashTable, int data)
        { 
            //哈希函数,除留余数法
            int hashAddress = Hash(hashTable,data);

            //如果不为0,则说明发生冲突
            while (hashTable[hashAddress] != 0)
            {
                //利用开放定址的线性探测法解决冲突
                hashAddress = (++hashAddress) % hashTable.Length;
            }

            //将待插入值存入字典中
            hashTable[hashAddress] = data;
        }

        /// <summary>
        /// 哈希表查找
        /// </summary>
        /// <param name="hashTable">哈希表</param>
        /// <param name="data">待查找的值</param>
        /// <returns></returns>
        public static int Search(int[] hashTable, int data)
        {
            //哈希函数,除留余数法
            int hashAddress = Hash(hashTable,data);

            //冲突发生
            while (hashTable[hashAddress] != data)
            {
                //利用开放定址的线性探测法解决冲突
                hashAddress = (++hashAddress) % hashTable.Length;

                //查找到了开放单元或者循环回到原点,表示查找失败
                if (hashTable[hashAddress] == 0 || hashAddress==Hash(hashTable,data)) return -1;
            }
            //查找成功,返回值的下标
            return hashAddress;
        }

        /// <summary>
        /// 哈希函数(除留余数法)
        /// </summary>
        /// <param name="hashTable">待操作哈希表</param>
        /// <param name="data"></param>
        /// <returns>返回数据的位置</returns>
        public static int Hash(int[] hashTable, int data)
        {
            return data % hashTable.Length;
        }
    }
}

 

 

 

 

posted on 2018-05-27 22:07  一个女的  阅读(112)  评论(0编辑  收藏  举报