一.总结
数组=哈希表(每个键值只有一个元素),查找时间O(1)空间O(n)
if-else串行查找,将可能性越大的放在越靠前位置可提高查找效率,尽快找到,减少比较次数,最差查找时间O(n)
switch三种查找方法
-
case项较少,或case整数值不连续,二分法查找,查找时间O(logn)
-
case项较多,且case整数值连续:跳转表,同数组,查找时间O(1)空间O(n)
跳转表工作方法:
相对索引号 = 当前case值 -最小case值
索引地址 = 起始地址 + 相对索引号 * 表项一格大小
因起始地址也要占空间,且索引号需连续(同数组)
故跳转表占空间为(case最大值 - case最小值 + 1) + 1 个单位
二.代码验证
microContinuous.c
int i;
int a = 5;
switch (a) {
case 0: i = 0; break;
case 1: i = 1; break;
case 2: i = 2; break;
default: i = 3; break;
}
return i;
microContinuous.s
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $5, -8(%rbp)
cmpl $1, -8(%rbp)
je .L2
cmpl $2, -8(%rbp)
je .L3
cmpl $0, -8(%rbp)
jne .L4
movl $0, -4(%rbp)
jmp .L5
.L2:
movl $1, -4(%rbp)
jmp .L5
.L3:
movl $2, -4(%rbp)
jmp .L5
.L4:
movl $3, -4(%rbp)
nop
.L5:
movl -4(%rbp), %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
continuous0.c
int main(void) {
unsigned int i, j;
i = 3;
switch (i)
{
case 0:j = 0;break;
case 1:j = 1;break;
case 2:j = 2;break;
case 3:j = 3;break;
case 4:j = 4;break;
default:j = 10;break;
}
}
continuous0.s
.L4:
.long .L8-.L4
.long .L7-.L4
.long .L6-.L4
.long .L5-.L4
.long .L3-.L4
.text
.L8:
movl $0, -8(%rbp)
jmp .L9
.L7:
movl $1, -8(%rbp)
jmp .L9
.L6:
movl $2, -8(%rbp)
jmp .L9
.L5:
movl $3, -8(%rbp)
jmp .L9
.L3:
movl $4, -8(%rbp)
jmp .L9
.L2:
movl $10, -8(%rbp)
nop
.L9:
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
continuous10.c
int main(void) {
unsigned int i, j;
i = 3;
switch (i)
{
case 10:j = 10;break;
case 11:j = 11;break;
case 12:j = 12;break;
case 13:j = 13;break;
case 14:j = 14;break;
default:j = 20;break;
}
}
continuous10.s
.L4:;跳转表
.long .L8-.L4
.long .L7-.L4
.long .L6-.L4
.long .L5-.L4
.long .L3-.L4
.text
.L8:
movl $10, -8(%rbp)
jmp .L9
.L7:
movl $11, -8(%rbp)
jmp .L9
.L6:
movl $12, -8(%rbp)
jmp .L9
.L5:
movl $13, -8(%rbp)
jmp .L9
.L3:
movl $14, -8(%rbp)
jmp .L9
.L2:
movl $20, -8(%rbp)
nop
.L9:
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"
halfContinuous.c
int main(void) {
unsigned int i, j;
i = 3;
switch (i)
{
case 10:j = 10;break;
case 11:j = 11;break;
//case 12:j = 12;break;
case 13:j = 13;break;
case 14:j = 14;break;
default:j = 20;break;
}
}
halfContinuous.s
.L3:
cmpl $13, -4(%rbp)
je .L6
cmpl $14, -4(%rbp)
je .L7
jmp .L5
.L4:
movl $10, -8(%rbp)
jmp .L8
.L2:
movl $11, -8(%rbp)
jmp .L8
.L6:
movl $13, -8(%rbp)
jmp .L8
.L7:
movl $14, -8(%rbp)
jmp .L8
.L5:
movl $20, -8(%rbp)
nop
.L8:
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"