mirror of
https://github.com/neilotoole/sq.git
synced 2024-12-24 16:51:34 +03:00
2f2dfd6e47
- Implement `sq diff --data`.
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package lcs
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// For each D, vec[D] has length D+1,
|
|
//
|
|
// and the label for (D, k) is stored in vec[D][(D+k)/2].
|
|
type label struct {
|
|
vec [][]int
|
|
}
|
|
|
|
// Temporary checking DO NOT COMMIT true TO PRODUCTION CODE
|
|
const debug = false
|
|
|
|
// debugging. check that the (d,k) pair is valid
|
|
// (that is, -d<=k<=d and d+k even)
|
|
func checkDK(D, k int) {
|
|
if k >= -D && k <= D && (D+k)%2 == 0 {
|
|
return
|
|
}
|
|
panic(fmt.Sprintf("out of range, d=%d,k=%d", D, k))
|
|
}
|
|
|
|
func (t *label) set(D, k, x int) {
|
|
if debug {
|
|
checkDK(D, k)
|
|
}
|
|
for len(t.vec) <= D {
|
|
t.vec = append(t.vec, nil)
|
|
}
|
|
if t.vec[D] == nil {
|
|
t.vec[D] = make([]int, D+1)
|
|
}
|
|
t.vec[D][(D+k)/2] = x // known that D+k is even
|
|
}
|
|
|
|
func (t *label) get(d, k int) int {
|
|
if debug {
|
|
checkDK(d, k)
|
|
}
|
|
return int(t.vec[d][(d+k)/2])
|
|
}
|
|
|
|
func newtriang(limit int) label {
|
|
if limit < 100 {
|
|
// Preallocate if limit is not large.
|
|
return label{vec: make([][]int, limit)}
|
|
}
|
|
return label{}
|
|
}
|