牛客网查找类型+排序的选择题---手记1

0、其中希尔排序的时间复杂度为O(n^1.5)
在这里插入图片描述

归并排序的常规实现方法是O(n)辅助空间。优化过的算法可以只使用O(1)的空间。利用的是反转偏移的技巧。
在这里插入图片描述
0.1 二叉树的性质
二叉树有以下几个性质:TODO(上标和下标)
性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

1、深度为k的二叉树最多有2的k次方-1个结点,深度为7的二叉树有127个结点,深度为8的二叉树有255个结点,所以154个结点的二叉树有8层。
2、当采用分块查找时,数据的组织方式为:数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块
3、在索引顺序表中,实现分块查找,在等概率查找情况下,其平均查找长度不仅与表中元素个数有关,而且与每块中元素个数有关。
4、二分/折半查找
代码实现

public static int biSearch(int arr[], int target) {
        int low = 0, high = arr.length - 1;
        int mid;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (arr[mid] == target)
                return mid;
            else if (arr[mid] < target)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return -1;
    }

性能分析

时间复杂度:

因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:

一次二分剩下:n/2 
两次二分剩下:n/2/2 = n/4 
……. 
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,即
n/(2^m)=1

所以由上式可得 : 2^m=n
进而可求出时间复杂度为: log2(n)
5、分块/索引查找:假设索引表有n个元素,每块含有s个元素,平均查找长度为:ASL=(n/s+s)/2 +1,时间复杂度为O(n)~O(log2n)
6、三种静态查找算法:顺序、二分/折半、索引/分块查找
7、Floyd
8、适于对动态查找表进行高效率查找的组织结构是分块有序表(错)
如果线性表既要快速查找又要经常动态变化,则可采用分块查找。
而这里说的是动态查找表!!!动态查找表是在查找的同时允许对表做修改操作(插入或者删除)的表 。
静态查找表: 只进行以下2个操作:
1.查找某个“特定”数据元素是否在查找表中
2.查找某个“特定”数据元素的各种属性
有序表、分块有序表、线性链表都是静态查找表
性能分析:平均查找长度:(当查找关键字等概率时)ASL = 1/(n+1)
动态查找表: 表结构是在查找过程中动态生成的,通俗解释,对于给定key,若表中存在某关键字与key相等则查找成功返回,若未找到则插入关键字等于key的记录。
二叉排序树、平衡二叉树、B树、B+树都是动态查找。(对查找表进行插入和删除操作—即为动态的)
9、选择排序是每轮选一个最小值出来, 所以32轮就有32个排好了
10、 使用二分搜索算法在 1000 个有序元素表中搜索一个特定元素,在最坏情况下,搜索总共需要比较的次数为( )。
二分搜索的时间复杂度是
O(log2 n)取下线然后再加1
11、用二分法查找长度为10的、排好序的线性表,查找不成功时,最多需要比较多少次?
二分查找,可以用二叉判定树,查找不成功的次数不超过判定树的深度,即(log2n)+1,其中log2n向下取整
12、具有12个关键字的有序表,折半查找的平均查找长度()

将12个数画成完全二叉树,第一层有1个、第二次2个、第三层4个,第四层只有5个。
二分查找时:
第一层需要比较1次
第二两个数,每个比较2次
第三层四个数,每个比较3次
第四层五个数,每个比较4次
则平均查找长度即为:(1+22+34+4*5)/12 = 37/12 = 3.0833 即为 A、3.1
13、使用KMP算法在文本串S中找模式串P是一种常见的方法。假设S=P={xyxyyxxyx},亦即将S对自己进行匹配,匹配过程中正确的next数组是____。
0,1,1,2,3,1,2,2,3
x y x y y x x y x
0 0 1 2 0 1 1 2 3 首位-1,别的位后移一位
-1 0 0 1 2 0 1 1 2 +1
0 1 1 2 3 1 2 2 3
14、在KMP算法中,已知模式串为ADABCADADA,请写出模式串的next数组值?
0,1,1,2,1,1,2,3,4,3
A D A B C A D A D A
0 0 1 0 0 1 2 3 2 3 首位-1,别的位后移一位
-1 0 0 1 0 0 1 2 3 2 +1
0 1 1 2 1 1 2 3 4 3
15、拓扑排序可以判断出一个有向图是否有环(回路)
16、关于红黑树和AVL树,以下哪种说法正确?abcd
a 两者都属于自平衡二叉树;
b 两者查找,插入,删除的时间复杂度相同; O(log2 n)
c 包含n个内部节点的红黑树的高度是O(log(n));
d JDK的TreeMap是一个红黑树的实现

关于红黑树和AVL树,来自网络:

1 红黑树的 好处 及 用途

红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。

红黑树能够以 O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。

当然,红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。

在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。

典型的用途是实现关联数组

2 AVL树是最先发明的自平衡二叉查 找树。在AVL树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。

引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度.为此,就必须每向二叉树插入一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度.

AVL树的定义:
一棵AVL树满足以下的条件:
1>它的左子树和右子树都是AVL树
2>左子树和右子树的高度差不能超过1
从条件1可能看出是个递归定义,如GNU一样.

性质:
1>一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)
2>一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)).
3>一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)).

从1这点来看 红黑树是牺牲了严格的高度平衡的优越条件 为 代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高.

17、快希选堆 不稳定算法
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的否则称为不稳定的
堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
18、已知数据表A中每个元素距其最终位置不远,为节省时间排序,应采用什么方法排序?插入排序
19、任何一个基于"比较"的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为?
因为6个数字的排列组合是6!,
按照决策树每次可以判断一半的情况,2^k
要求2^k > 6!
取log后得到 k > log(6!) = log(720)
log(2^9) = log(512) = 9 < log(720) < log(2^10) = log(1024) = 10,
所以应该至少选10次。
20、在有序列表中通过二分查找的复杂度一定是O(log2n)
21、排序二叉树元素查找的复杂度可能为O(n)
22、既希望较快的查找又便于线性表动态变化的查找方法是 ( )
索引顺序查找又称为分块查找,效率在顺序查找和折半查找之间
23、枚举排序,通常也被叫做秩排序,算法基本思想是:对每一个要排序的元素,统计小于它的所有元素的个数,从而得到该元素在整个序列中的位置,时间复杂度为O(n^2) 。
24、无向图G=(V E),其中V={a,b,c,d,e,f},E={<a,b>,<a,e>,<a,c>,<b,e>,<c,f>,<f,d>,<e,d>}对该图进行深度优先排序,得到的顶点序列正确的是() D
A. a,b,e,c,d,f
B. a,c,f,e,b,d
C. a,e,b,c,f,d
D. a,e,d,f,c,b
解析:
A. a, b, e, c, d, f
a->b, 没问题;到b后,b的邻接点中只剩下e未被访问,b->e没问题
e->c,不行,e此时仍有未被访问的邻接点d, 且e没有跟c连通,答案错误

B. a, c, f, e, b, d
a->c->f, 没问题;f->e,不行,f此时仍有未被访问的邻接点d,且f没有跟e连通,答案错误

C. a, e, b, c, f, d
a->e->b,没问题;到b后,b的邻接点均被访问,应回溯到e,然后访问e其他未被访问的邻接点(只剩d),且b没有跟c连通,答案错误

D. a, e, d, f, c, b
a->e->d->f->c,没问题;到c后,其两个邻接点a与f均已被访问,按c->f->d->e->a回溯时候发现,e顶点仍有未被访问的顶点b,于是a->e->d->f->c->b
25、

猜你喜欢

转载自blog.csdn.net/csdnlijingran/article/details/83502759