Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Search 如何在八度的单元格数组(字符串)中排序并高效地查找元素?_Search_Sorting_Find_Octave_Cell Array - Fatal编程技术网

Search 如何在八度的单元格数组(字符串)中排序并高效地查找元素?

Search 如何在八度的单元格数组(字符串)中排序并高效地查找元素?,search,sorting,find,octave,cell-array,Search,Sorting,Find,Octave,Cell Array,是否有此功能的内置功能?是检查此项: GNU倍频程在线性时间内搜索字符串单元格数组O(n): 另一个答案是cellidx,它按八度折旧,它仍然运行,但他们说使用ismember,如下所示: %linear time string index search. a = ["hello"; "unsorted"; "world"; "moobar"] b = cellstr(a) %b = %{ % [1,1] = hello % [2,1] = unsorted % [3,1] = world

是否有此功能的内置功能?

是检查此项:

GNU倍频程在线性时间内搜索字符串单元格数组
O(n)
: 另一个答案是
cellidx
,它按八度折旧,它仍然运行,但他们说使用
ismember
,如下所示:

%linear time string index search.
a = ["hello"; "unsorted"; "world"; "moobar"]
b = cellstr(a)
%b =
%{
%  [1,1] = hello
%  [2,1] = unsorted
%  [3,1] = world
%  [4,1] = moobar
%}
find(ismember(b, 'world'))   %returns 3
“世界”位于索引槽3中。这是一个昂贵的过程,因为无论是否找到它,它都必须遍历所有元素

若要实现a,则需要对列表进行预排序,然后可以使用二进制搜索:

如果单元格数组已排序,则可以执行
O(log-n)
最坏情况:
不要羞于使用此dob的管道胶带,它是将装置连接在一起的唯一工具。

cellidx解决方案不符合OP的效率要求,因此已被弃用(如
帮助cellidx
所述)

Håvard Geithus在一篇评论中建议在排序的单元格字符串数组上使用lookup()函数,这比cellidx的效率要高得多。不过,它仍然是一种二进制搜索,而大多数现代语言(甚至许多已有20年历史的语言)让我们能够轻松访问关联数组,这将是一种更好的方法

虽然Octave显然没有关联的数组,但解释器对Octave的变量(包括结构)有效地使用了数组,因此您可以让我们了解它,如下所述:

建议使用javaObject(“java.util.Hashtable”)。这将带来一些设置开销,但如果您经常使用它,这将是一个性能胜利。在C或C++中的某些图书馆中链接可能是可行的吗?但一定要考虑这是否是一个可维护的选项


注意:我对八度音阶比较陌生,在自己研究的过程中写下这篇文章(这就是我在这里结束的原因)。我还没有对这些技术的效率进行测试,虽然我对底层算法有相当的了解,但我可能对倍频程中的实际效率做出了不合理的假设。

效果很好。不需要排序。如果未找到,则返回
0
。我想知道效率…这是暴力搜索吗?看起来是的。如果使用“which”函数并传递函数名,它将指向源文件。在本例中,“哪个cellidx”。如果您查看源代码,您会发现它确实执行了暴力搜索。请参阅我的答案(在问题提出很久之后添加)了解非暴力搜索选项。太糟糕了,但是cellidx被弃用(为什么?),并在Octave 3.8中删除了。给定一个按字典顺序排序的单元格数组,您可以使用Octave中的函数“lookup”执行二进制搜索。现在剩下的就是排序;)
%linear time string index search.
a = ["hello"; "unsorted"; "world"; "moobar"]
b = cellstr(a)
%b =
%{
%  [1,1] = hello
%  [2,1] = unsorted
%  [3,1] = world
%  [4,1] = moobar
%}
find(ismember(b, 'world'))   %returns 3
function i = binsearch(array, val, low, high)
  %binary search algorithm for numerics, Usage:
  %myarray = [ 30, 40, 50.15 ];        %already sorted list
  %binsearch(myarray, 30,    1, 3)     %item 30 is in slot 1
  if ( high < low )
    i = 0;
  else
    mid = floor((low + high) / 2);
    if ( array(mid) > val )
      i = binsearch(array, val, low, mid-1);
    elseif ( array(mid) < val )
      i = binsearch(array, val, mid+1, high);
    else
      i = mid;
    endif
  endif
endfunction

function i = binsearch_str(array, val, low, high)
  % binary search for strings, usage:
  %myarray2 = [ "abc"; "def"; "ghi"];       #already sorted list
  %binsearch_str(myarray2, "abc", 1, 3)     #item abc is in slot 1
  if ( high < low )
    i = 0;
  else
    mid = floor((low + high) / 2);
    if ( mystrcmp(array(mid, [1:end]), val) == 1 )
      i = binsearch(array, val, low, mid-1);
    elseif ( mystrcmp(array(mid, [1:end]), val) == -1 )
      i = binsearch_str(array, val, mid+1, high);
    else
      i = mid;
    endif
  endif
endfunction
function ret = mystrcmp(a, b)
    %this function is just an octave string compare, it's exactly like 
    %strcmp(str1,str2) in C, or java.lang.String.compareTo(...) in Java.
    %returns 1 if string a > b
    %returns 0 if string a == b
    %return -1 if string a < b
    letters_gt = gt(a, b);      %list of boolean a > b
    letters_lt = lt(a, b);      %list of boolean a < b
    ret = 0;
    %octave makes us roll our own string compare because 
    %strings are arrays of numerics
    len = length(letters_gt);
    for i = 1:len
        if letters_gt(i) > letters_lt(i)
            ret = 1;
            return
        elseif letters_gt(i) < letters_lt(i)
            ret = -1;
            return
        endif
    end;
endfunction

%Assuming that myarray is already sorted, (it must be for binary 
%search to finish in logarithmic time `O(log-n))` worst case, then do

myarray = [ 30, 40, 50.15 ];        %already sorted list
binsearch(myarray, 30,    1, 3)     %item 30 is in slot 1
binsearch(myarray, 40,    1, 3)     %item 40 is in slot 2
binsearch(myarray, 50,    1, 3)     %50 does not exist so return 0
binsearch(myarray, 50.15, 1, 3)     %50.15 is in slot 3

%same but for strings:
myarray2 = [ "abc"; "def"; "ghi"];       %already sorted list
binsearch_str(myarray2, "abc", 1, 3)     %item abc is in slot 1
binsearch_str(myarray2, "def", 1, 3)     %item def is in slot 2
binsearch_str(myarray2, "zzz", 1, 3)     %zzz does not exist so return 0
binsearch_str(myarray2, "ghi", 1, 3)     %item ghi is in slot 3
myarray = [ 9, 40, -3, 3.14, 20 ];        %not sorted list 
myarray = sort(myarray) 

myarray2 = [ "the"; "cat"; "sat"; "on"; "the"; "mat"];       %not sorted list 
myarray2 = sortrows(myarray2)
Built-in Function: struct ("field", value, "field", value,...)
Built-in Function: isstruct (expr)
Built-in Function: rmfield (s, f)
Function File: [k1,..., v1] = setfield (s, k1, v1,...)
Function File: [t, p] = orderfields (s1, s2)
Built-in Function: fieldnames (struct)
Built-in Function: isfield (expr, name)
Function File: [v1,...] = getfield (s, key,...)
Function File: substruct (type, subs,...)