Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tcl中的排序列表中搜索数字_Tcl - Fatal编程技术网

在Tcl中的排序列表中搜索数字

在Tcl中的排序列表中搜索数字,tcl,Tcl,我正在使用Tcl。我有一个排序的实数列表。给定编号n我需要找到列表元素的索引,它是: 小于或等于n 或大于n 有什么标准的方法可以做到这一点吗lsearch要求精确匹配,因此无法使用。对于Tcl 8.6(仍处于测试阶段),lsearch将按照您的要求执行,-sorted和new-bisect选项允许以下操作: -对分 当列表元素按排序顺序排列时,搜索不精确。对于递增列表,元素小于的最后一个索引 或等于返回的模式。上个月的递减列表 元素大于或等于模式的索引为 返回 对于8.6之前的Tcl版本,

我正在使用Tcl。我有一个排序的实数列表。给定编号
n
我需要找到列表元素的索引,它是:

  • 小于或等于
    n
  • 或大于
    n
有什么标准的方法可以做到这一点吗
lsearch
要求精确匹配,因此无法使用。

对于Tcl 8.6(仍处于测试阶段),lsearch将按照您的要求执行,
-sorted
和new
-bisect
选项允许以下操作:

-对分

当列表元素按排序顺序排列时,搜索不精确。对于递增列表,元素小于的最后一个索引 或等于返回的模式。上个月的递减列表 元素大于或等于模式的索引为 返回

对于8.6之前的Tcl版本,您必须滚动自己的代码,鉴于列表已排序,编写具有所需属性的二进制搜索应该相当简单,Rosetta代码包含纯二进制搜索的描述以及Tcl实现。你应该能够以此为出发点

这是我创建的一个非常快速的版本,它返回您搜索的值或大于该值的值的索引。要注意的异常是列表的末尾,搜索最大元素之外的值将返回最大的元素。它只有最少的测试,所以如果你使用它做一些额外的测试!如果搜索找到值,我也不会停止,如果这种情况可能经常发生,您可能希望为此进行优化

set lst [lsort -real [list 1.2 3.4 5.4 7.9 2.3 1.1 0.9 22.7 4.3]]
puts $lst

# Assumes that lst is sorted in ascending order
proc bisect { lst val } {

    puts "Looking for $val in $lst"

    set len [llength $lst]

    # Initial interval - the start to the middle of the list
    set start 0
    set end [expr $len - 1]
    set mid [expr $len / 2]
    set lastmid -1

    while { $mid != $lastmid } {
        if { [expr $val <= [lindex $lst $mid]] } {
            # val lies somewhere between the start and the mid
            set end $mid

        } else {
            # val lies somewhere between mid and end
            set start [expr $mid + 1]
        }

        set lastmid $mid
        set mid [expr ($start + $end ) / 2]
    }

    return $mid
}

set res [bisect $lst 2.4]
puts "found [lindex $lst $res] at index $res"

set res [bisect $lst -1]
puts "found [lindex $lst $res] at index $res"

set res [bisect $lst 999]
puts "found [lindex $lst $res] at index $res"

set res [bisect $lst 1.2]
puts "found [lindex $lst $res] at index $res"

set res [bisect $lst 0.9]
puts "found [lindex $lst $res] at index $res"

set res [bisect $lst 22.7]
puts "found [lindex $lst $res] at index $res"
set lst[lsort-real[list 1.2 3.4 5.4 7.9 2.3 1.1 0.9 22.7 4.3]]
卖出$lst
#假设lst按升序排序
过程对分{lst val}{
将“在$lst中查找$val”
设置长度[L长度$lst]
#初始间隔-列表中间的开始
将开始设置为0
设置结束[expr$len-1]
设置中间[expr$len/2]
设置lastmid-1
而{$mid!=$lastmid}{
如果{[expr$val]