《C++开发工程师岗位必备知识点六》

①树的带权路径长度

树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。

②插入排序的理解

始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去,每次都选择当前元素,插入到前面已经排好序的序列中。

③选择排序的理解

每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。即每次在后面未排序好的序列中选择一个最小(或最大)的元素放到本来无序的序列的第一个元素中。

④数组定义问题

int a[][4],这种定义是错的,二维数组需要初始化,即int a[][4]={1,2,3,4}。

⑤关系运算符优先级问题

⑥深度优先搜索例子探索

图的深度遍历思想是,在当前节点,挑选一条没有走过的路,抵达路尽头的节点,如果在路尽头的节点附近的节点都走过,则退回,

直到可以选择没有走过路的节点,具体解析:

第一个:aebdfc:a-e-b-e-d-f-c;

第二个:aedfcb:a-e-d-f-c-f-d-e-b;

第三个:acfdeb:a-c-f-d-e-b;

第四个:aefdcb:a-e-f-d-c-b;

第五个:aefdcb:a-e-f-d-f-c(c此处没有走的是c节点)-e-b(错误)

⑦指针的进一步理解

实例分析:

#include<stdio.h>

int main()

{  static char *s[] = {"black""white""pink""violet"};

    char **ptr[] = {s+3, s+2, s+1, s}, ***p;

    p = ptr;

    ++p;

    printf("%s", **p+1);

    return 0;

}

首先s是一个指针数组,存的是字符串的首地址,char **ptr[] 是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址,p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针,p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址, **p就得到了s数组中s+3这个元素的内容, s数组中保存的是字符串的首地址,那就得到了"pink"这个元素的首地址,在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上,所以 %s, **p+1还是"ink"。

⑧哈希函数相关

哈希函数构造方法:

1.直接定址法:H(key) = a*key + b

2.除留余数法:H(key) = key % p(p为不大于散列表表长,但最接近或等于表长的质数p

3.数字分析法:选取r进制数数码分布较为均匀的若干位作为散列地址

4.平方取中法:取关键字的平方值的中间几位作为散列地址

5.折叠法:将关键字分割成位数相同的几部分,然后取这几部份的叠加和作为散列地址

处理冲突的方法:

1.开放定址法(闭哈希表)

    Hi = (H(key)+di) % m(m表示散列表表长,di为增量序列)

    1)线性探测法

    2)平方探测法

    3)再散列法

    4)伪随机数法

    注:在开放定址的情形下,不能随便物理删除表中已有元素,若删除元素将会截断其他具有相同散列地址的元素的查找地址。若想删除一个元素,给它做一个删除标记,进行逻辑删除。

2.拉链法(开哈希表)

    把所有的同义词存储在一个线性链表中,线性链表由其散列地址唯一标识,拉链法适用于经常进行插入和删除的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值