erl_线性结构-折半查找

折半查找又叫二分查找:在有序表中,把待查找数据值与查找范围的中间元素值进行比较。
优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
经常用于变动不平凡的数据结构。

代码如下:

%% 有序列表可以用折半查找 min->max
half_find([],_)->
 false;
half_find(List,Data)->
 Len = length(List),
 HalfPos = ceil(Len/2),
 HalfData = lists:nth(HalfPos,List),
 {HList,TList} = lists:split(HalfPos,List),
 if Data > HalfData->
   half_find(HList,Data);
  Data < HalfData->
   half_find(TList,Data);
  true->
   HalfData
 end.

ceil(N) ->
 T = trunc(N),
 case N == T of
  true -> T;
  false -> 1 + T
 end.

总结:
其实这样的有序lists 和avl_tree 的查找差不错,gb_tree 的平衡(balance函数)处理就是先把二叉树变成有序lists让后再折半平衡重构。

感兴趣可以看看gb_tree 的balance代码

-spec balance(Tree1) -> Tree2 when
      Tree1 :: tree(Key, Value),
      Tree2 :: tree(Key, Value).

balance({S, T}) ->
    {S, balance(T, S)}.

balance(T, S) ->
    balance_list(to_list_1(T), S).

balance_list(L, S) ->
    {T, []} = balance_list_1(L, S),
    T.

balance_list_1(L, S) when S > 1 ->
    Sm = S - 1,
    S2 = Sm div 2,
    S1 = Sm - S2,
    {T1, [{K, V} | L1]} = balance_list_1(L, S1),
    {T2, L2} = balance_list_1(L1, S2),
    T = {K, V, T1, T2},
    {T, L2};
balance_list_1([{Key, Val} | L], 1) ->
    {{Key, Val, nil, nil}, L};
balance_list_1(L, 0) ->
    {nil, L}.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值