File: 202502-c2w-bisect.sh

package info (click to toggle)
ble.sh 0.4.0~git20250321.d4c812b-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 12,516 kB
  • sloc: sh: 71,367; awk: 1,316; cpp: 750; ansic: 186; javascript: 43; makefile: 35
file content (78 lines) | stat: -rw-r--r-- 2,860 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- mode: sh; mode: sh-bash; -*-

#------------------------------------------------------------------------------
# 現在の実装 (51us)
function bisect.0 {
  local c=$1 l=0 u=${#_ble_util_c2w_musl_ranges[@]} m
  while ((l+1<u)); do
    ((_ble_util_c2w_musl_ranges[m=(l+u)/2]<=c?(l=m):(u=m)))
  done
  #echo "${_ble_util_c2w_musl_ranges[l]} <= $c < ${_ble_util_c2w_musl_ranges[l+1]}"
  w=${_ble_util_c2w_musl[_ble_util_c2w_musl_ranges[l]]}
}

#------------------------------------------------------------------------------
# ${a[@]:c+1} の残り要素を数える方法 (260us)
function bisect.1 {
  local a c=$1
  a=("${_ble_util_c2w_musl[@]:c+1}")
  ((i=${#_ble_util_c2w_musl[@]}-${#a[@]}-1))
  #echo "${_ble_util_c2w_musl_ranges[i]} <= $c < ${_ble_util_c2w_musl_ranges[i+1]}"
  w=${_ble_util_c2w_musl[_ble_util_c2w_musl_ranges[i]]}
}

#------------------------------------------------------------------------------
# ${a[@]:c+1:1} で見つかる最初の要素に初めから答えを入れておく方法 (64us)
function bisect.2.init {
  _ble_util_c2w_musl_reverse_index=()
  _ble_util_c2w_musl_reverse=()
  local prev=0 i
  for i in "${!_ble_util_c2w_musl[@]}"; do
    _ble_util_c2w_musl_reverse_index[i]=$prev
    _ble_util_c2w_musl_reverse[i]=${_ble_util_c2w_musl[prev]}
    prev=$i
  done
}
bisect.2.init

function bisect.2 {
  #local c=$1
  #local c1=${_ble_util_c2w_musl_reverse_index[*]:c+1:1}
  #echo "$c1 <= $c < ????"
  w=${_ble_util_c2w_musl_reverse[*]:$1+1:1}
}

# 関数呼び出しをスキップすると 58us になる (6us だけ速い)
# ble-measure 'w=${_ble_util_c2w_musl_reverse[*]:6680+1:1}'; echo "w=$w"
# ble-measure 'w=${_ble_util_c2w_musl_reverse[*]:6681+1:1}'; echo "w=$w"
# ble-measure 'w=${_ble_util_c2w_musl_reverse[*]:6682+1:1}'; echo "w=$w"

#------------------------------------------------------------------------------
# 現在の二分探索を完全に算術式にしたもの (45us)

function bisect.3 {
  local c=$1 l=0 u=${#_ble_util_c2w_musl_ranges[@]} m
  local L='_ble_util_c2w_musl_ranges[m=(l+u)/2]<=c?(l=m):(u=m),l+1<u&&L'
  ((l+1<u&&L))
  #echo "${_ble_util_c2w_musl_ranges[l]} <= $c < ${_ble_util_c2w_musl_ranges[l+1]}"
  w=${_ble_util_c2w_musl[_ble_util_c2w_musl_ranges[l]]}
}

#------------------------------------------------------------------------------

ble-measure 'bisect.0 6680'; echo "w=$w"
ble-measure 'bisect.0 6681'; echo "w=$w"
ble-measure 'bisect.0 6682'; echo "w=$w"
ble-measure 'bisect.1 6680'; echo "w=$w"
ble-measure 'bisect.1 6681'; echo "w=$w"
ble-measure 'bisect.1 6682'; echo "w=$w"
ble-measure 'bisect.2 6680'; echo "w=$w"
ble-measure 'bisect.2 6681'; echo "w=$w"
ble-measure 'bisect.2 6682'; echo "w=$w"
ble-measure 'bisect.3 6680'; echo "w=$w"
ble-measure 'bisect.3 6681'; echo "w=$w"
ble-measure 'bisect.3 6682'; echo "w=$w"

# bisect.3 6680
# bisect.3 6681
# bisect.3 6682