查找
一.学习总结:
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.设计思路:
{
如果T无孩子 返回0
}
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的右孩子中找
}
3.PTA提交列表
这个题其实我是不会做的,挣扎不出来,就去问了度娘,然后找到了很好的解决方法 ,此方法比较思路清晰简单易懂,就自己打了一遍,竟然过了,哈哈哈哈,开心
题目三:QQ帐户的申请与登陆
1.设计思路:
while(T--)
{
定义命令符,QQ号,密码
如果是新用户
if(M.find(id)!=M.end()) 已经存在该用户
else 存入新信息
如果是老用户
if(tmp==pass) 不存在该用户
else 错误
}
2.代码截图
3.PTA提交列表
经过大佬和度娘的指导,我深刻了解了map模拟算法,一直编译错误是因为选错编译器,改成C++就好了
三.PTA排名
四。阅读代码
{
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;
}
}
}