2013-04-15 1 views
0

Как делить/ссылаться на переменные 3 массива в этом коде вместо использования изменяемых значений?Что такое неизменяемая версия для массива de/reference?

Приведенный ниже код вычисляет самую длинную общую подпоследовательность (LCS) по диагонали, пересекающей массив m * n.

Аргументы 2 символьные массивы следующим образом:

Так ЛВП метод должен приводить к длине 4, как самые длинные символы общей суб-последовательности «ACBB» & «bcbb».

let private s1 = "ABCDBB".ToCharArray()  
let private s2 = "CBACBAABA".ToCharArray() 
    let public lcs_seq_1d_diags (x:char[]) (y:char[]) = 
     let m = x.Length 
     let n = y.Length 

     let mutable dk2 = Array.create (1+m) 0 
     //printfn "\r\n0: %A" dk2 
     let mutable dk1 = Array.create (1+m) 0 
     //printfn "1: %A" dk1 
     let mutable dk = Array.create (1+m) 0 

     for k = 2 to m+n do 
      let low = max 1 (k-m) 
      let high = min (k-1) n 

      for j = low to high do 
       let i = k - j 
       if x.[i-1] = y.[j-1] then 
        dk.[i] <- dk2.[i-1] + 1 
       else 
        dk.[i] <- max dk1.[i] dk1.[i-1] 

      let mutable temp = dk2 
      dk2 <- dk1 
      dk1 <- dk 
      dk <- temp 

     dk1.[m] 

let private res_seq_1d_rows = duration (fun() -> lcs_seq_1d_rows s1 s2) 
//res_seq_1d_rows = 4 
+0

Изменчивость определяется типом данных - если вы хотите использовать System.Array то вам нужно ожидать/иметь дело с изменчивостью. – ildjarn

ответ

0

Массивы изменяемые по умолчанию. Вместо этого попробуйте использовать список, если вы хотите неизменность.

Попробуйте начать с вместо этого:

let s1 = List.ofSeq "ABCDBB" 
let s2 = List.ofSeq "CBACBAABA" 

Остальное я оставляю в качестве упражнения для читателя :-)