二叉排序树
二叉排序数的(递归)定义:
1、若左子树非空,则左子树所有节点的值均小于它的根节点;
2、若右子树非空,则右子树所有节点的值均大于于它的根节点;
3、左右子树也分别为二叉排序树。
排序算法
快排不适合对基本有序的数据集合进行排序,快排越是无序效率越高。基本有序是O(n2),归并是 nlogn,直接是 n
堆排序、选择排序、冒泡排序、快速排序、的时间复杂度为:nlogn、n2、n2、nlogn
递归题目
#include<stido.h>
int foo(int a ,int b)
{
if (b == 0) return 0;
if (b %2 == 0) return foo(a+a,b/2);
return foo(a+a,b/2)+a;
}
void main()
{
printf("%d",foo(1,3));
}
计算foo(1,3):此时a=1,b=3;
跳过两个if语句进入return foo(1+1,3/2)+1,即foo(2,1)+1;
计算foo(2,1):
同样,跳过两个if语句进入return foo(2+2,1/2)+2,即foo(4,0)+2;
计算foo(4,0):
进入第一个if语句,return 0;
逐层返回,得foo(2,1)=0+2=2;
再返回上一层,得foo(1,3)=2+1=3;
返回结果,foo(1,3)=3;
计算机网络
总部给某分公司分配的网络地址是172.16.2.0/24,该分公司有三个部门,每个部门计算机不多于30台,在网络配置时,进行子网划分,可以使用的子网掩码是()
答案:255.255.255.192或255.255.255.224
1.分公司的网络地址是172.16.2.0/24,子网掩码长度就是24位11111111.11111111.11111111.00000000(这个就不要问为什么了);
2.分公司3个部门,那么就用第25位和第26位来区分三个部门,11111111.11111111.11111111.00000000(00~11),直接排除A;
3.那么各个部门用来区分自己的子网掩码只剩下最后6位(27~32位)来表示了;
4.若用255.255.255.192,最后8位是11000000,只能表示11000000~11111111除去广播地址一共62台
5.若用255.255.255.224,最后8位是11100000,只能表示11100000~11111111除去广播地址一共30台
6.若用255.255.255.240,最后8位是11110000,只能表示11110000~11111111除去广播地址一共14台
TCP数据传输慢,UDP数据传输快,UDP缓冲区小于报文长度,则会丢失报文.DNS默认占用端口53
SQL
SELECT INTO 和 INSERT INTO SELECT
范式
数据库中删除约束的方法:
- sql server中删除约束的语句是:
alter table 表名 drop constraint 约束名
sp_helpconstraint 表名 找到数据表中的所有列的约束 - oracle中删除约束的语句:
先找到表的约束名称,执行:
select * from user_constraints; 其中 CONSTRAINT_NAME 为表的约束名称
然后删除约束:
alter table 表名 drop constraint 约束名 cascade; - mysql中删除约束的语句是:
1)删除主键约束:
alter table 表名 drop primary key;
2)删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);
数据库3级模式:
①模式(schema):
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
②外模式(external schema):
外模式也称子模式(subschema)或用户模式,它是数据库用固话(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
③内模式(internal schema):
内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理存储和存储方式的描述,是数据在数据库内部的组织方式。
Spring
单例模式下会共享普通成员变量和静态成员变量,多例模式下普通成员变量不共享,静态成员共享.
在开发中,springMVC优先使用单例模式,而且尽量不要在controller中设定成员变量.
如果要定义成员变量并为成员变量赋值可以配置source.properties,通过读取配置文件为成员变量初始化.
@Scope(“prototype”)表示每获取一个bean创建一个对象。这虽然看起来是多例。但成员变量并不共享。
要想成员变量共享,可设置为“session”或“globalSession”
JVM
off-heap叫做堆外内存,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。
集合问题
就这么说吧,对于集合的三种遍历方式删除:
1.普通for循环:可以删除
注意每次删除之后索引要–
2.Iterator遍历:可以删除
不过要使用Iterator类中的remove方法,如果用List中的remove方法会报错
3.增强for循环foreach:不能删除
强制用List中的remove方法会报错
ArrayList内部是动态数组实现,在增加空间时会复制全部数据到新的容量大一些的数组中。而LinkedList内部为双向链表,可以按需分配空间,扩展容量简单,因此LinkedList用时少。
java类加载机制
运行结果为:C A B D 1
public class ClassA {
static int count = 0;
static {
count++;
System.out.println("A");
}
public ClassA() {
System.out.println("B");
}
}
public class ClassB {
static {
ClassA t2;
System.out.println("C");
}
public static void main(String[] args) {
Class c1;
Class c2;
Class c3;
try {
c1 = ClassA.class;
c2 = Class.forName("ClassA");
ClassA a = new ClassA();
c3 = a.getClass();
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
if (c2 == c1&& c1 == c3) {
System.out.println("D");
} else {
System.out.println("E");
}
System.out.println(ClassA.count);
}
}
解析:
1.被标明为启动类的类(即包含main()方法的类)要初始化,所以ClassB最先初始化
2.ClassB没有父类,所以初始化自身的静态变量和静态块赋值(按照声明顺序),输出“C”
3.ClassA a = new ClassA(); 初始化ClassA,输出“AB”
4.因为类的加载信息只会在永久代里留存一份,所以c1,c2,c3实际上共用同一个ClassA.class对象,所以输出“D”
5.静态块static{}只会执行一次,所以count=1
杂项
- 调用函数时,入参及返回地址使用了栈
- 32位处理器是指处理器的数据总线是32位的
设计模式
单一职责原则:应该有且仅有一个原因引起类的变更(一个接口或一个类只有一个原则,它就只负责一件事)
里式替换原则:子类型必须能替换掉它们的基类型
依赖倒置原则:
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口隔离原则:
客户端不应该依赖它不需要的接口
类间的依赖关系应该建立在最小的接口上
迪米特法则:只与直接朋友进行通信