Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 查找列表中k个不同元素的最小子序列_Arrays_Sml_Smlnj - Fatal编程技术网

Arrays 查找列表中k个不同元素的最小子序列

Arrays 查找列表中k个不同元素的最小子序列,arrays,sml,smlnj,Arrays,Sml,Smlnj,我是sml的新手。我正在尝试编写一个简单的代码,它接受一个包含5个位置和特定数字的数组,并返回包含所有数字的最小子数组的长度。然而,我收到了很多在谷歌上找不到的错误信息。有人能帮我吗?代码如下 fun Min x y = if x>y then return y else return x local val a = Array.array (3,0) val cordela = Array.array(5,0) val k=0

我是sml的新手。我正在尝试编写一个简单的代码,它接受一个包含5个位置和特定数字的数组,并返回包含所有数字的最小子数组的长度。然而,我收到了很多在谷歌上找不到的错误信息。有人能帮我吗?代码如下

 fun Min x y = if x>y then return y else return x
    local
        val a = Array.array (3,0)
        val cordela = Array.array(5,0)
        val k=0
        val front=0
        val tail=0
        val min=5
        update(cordela,0,1)
        update(cordela,1,3)
        update(cordela,2,3)
        update(cordela,3,2)
        update(cordela,4,1)
    in   
        fun loop front = 
            case k>3 of
                if sub(a,sub(cordela,front)-1) = 0 then k=k+1 else()
                update(a,sub(cordela,front)-1),sub(a,sub(cordela,front)-1)+1)
                front = front +1
            | 
                min= Min (front-tail) min
                if sub(a,sub(cordela,front)-1) = 0 then k=k-1 else()
                update(a,sub(cordela,front)-1),sub(a,sub(cordela,front)-1)-1)
                tail=tail+1

            if 5>front then loop front+1 else min
    end 
我收到的错误消息有:

pl2.sml:16.13-16.15 Error: syntax error: replacing  OF with  LBRACKET
pl2.sml:18.36 Error: syntax error: inserting  LPAREN
pl2.sml:20.4 Error: syntax error: replacing  BAR with  EQUALOP
pl2.sml:22.5 Error: syntax error: inserting  LPAREN
pl2.sml:26.4 Error: syntax error: inserting  LPAREN
pl2.sml:27.2 Error: syntax error found at END
编辑:我正在尝试用sml编写此代码。它是用c写的++

while(front < N){
        if( k < K ){
            if ( e[cordela[front]-1] == 0 ) k += 1;
            e[cordela[front]-1] +=1;
            front++ ;
        }
        else{
            min = MIN(front - tail ,min);
            if ( e[cordela[tail]-1] ==1 ) k -= 1;
            e[cordela[tail]-1] -= 1;
            tail++;
        }
    }

正如John Coleman所说,SML/NJ不会给出非常有用的错误消息。您可以尝试和,因为它提供了更好的错误消息。不幸的是,这段代码在语法层面上有一些错误,这使得编译器很难给出有意义的错误。以下是一些正确语法的提示,以便您可以关注算法问题:

. 用一个字母来匹配每个字母;你的s太多了。 声明有趣的循环…=。。。里里外外。 完成此操作后,解决问题的函数模板可能如下所示:

fun smallest_subarray (needles : Array.array, haystack : Array.array) =
    let
      val ... = ...
      fun loop ... = ...
    in
      if Array.length needles > Array.length haystack
      then ...
      else loop ...
    end
如果问题没有解决方案,函数将返回什么~1.没有

如果你试图将C++程序转换成SML,尝试以函数的方式包含函数,从而很明显哪些标识符是函数的参数,并试图用逻辑来命名它们;我不知道cordela、e和k是什么,也不知道N是输入数组大小的函数还是常数

由于SML中的惯用解决方案使用递归(函数调用自身而不是迭代),因此您正在处理一个非平凡的算法问题和另一个范例。尝试解决一个类似但更简单的问题,其中算法更简单,并应用递归范式

例如,尝试编写一个函数,使用二进制搜索查找排序数组中元素的位置:

fun find x arr =
    let
      fun loop ... = ...
    in
      loop ...
    end

循环函数将以搜索边界(例如i和j)作为参数,如果在位置i处找到x,则返回一些i,或者不返回。您可以将此问题扩展到原始问题的方向,然后尝试编写一个函数,确定输入数组pinees是否按照pinees中给定的顺序出现在另一个输入数组haystack中。您可以先假定针和草堆已排序,然后假定它们未排序。

SML/NJ错误消息可能是不透明的。请注意,您缺少一个匹配的else,这在sml中不是可选的。@JohnColeman我修复了else语句,但仍然出现了一些不同的错误=>?。更一般地说,您似乎正在尝试用SML编写类似Java的代码。你的思维方式过于强制性,而不是功能性。另外-你为什么使用本地而不是let?@johncolman谢谢你,为了在MLIt中工作,我应该在这段代码中做些什么改进还不清楚你想做什么。您试图编写的函数的类型是什么?SML的代码非常冗长,但因为我不知道您要做什么,所以我无法给出具体的建议。您对SML的基本语义有很多困惑。例如如果suba、subcordela、front-1=0,则k=k+1,否则不会进行类型检查。因为k=k+1的类型是布尔型的,所以它不会用k+1替换k,而是比较k和k+1,计算结果为false,但末尾的类型是单位,而不是布尔型的,你的答案信息量很大,但仍然没有给学生留下任何信息。@SimonShine我试图解决你答案末尾提出的问题fun find x arr=let val j=length arr fun loop I=if x==Subar,然后我在循环j end中返回i else返回循环i-1是否正确?@maverick98:StackOverflow注释不适合讨论除原始问题外的其他问题的部分解决方案。及编号: