选择分支语句查找效率-switch,if-else,数组

一.总结

数组=哈希表(每个键值只有一个元素),查找时间O(1)空间O(n)
if-else串行查找,将可能性越大的放在越靠前位置可提高查找效率,尽快找到,减少比较次数,最差查找时间O(n)
switch三种查找方法

  1. case项较少,或case整数值不连续,二分法查找,查找时间O(logn)

  2. 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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值