-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathslow.go
69 lines (63 loc) · 1.54 KB
/
slow.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package jsonmap
import "sort"
// KeyIndex returns index of key. O(n) time.
// If key is not in the map, it returns -1.
// O(n) time if the key exists.
// O(1) time if the key does not exist.
//
// i := m.KeyIndex(key)
func (m *Map) KeyIndex(key Key) int {
elem, ok := m.elements[key]
if !ok {
return -1
}
i := 0
for e := m.first; e != elem; e = e.next {
i++
}
return i
}
// Keys returns all keys in the map. O(n) time and space.
//
// keys := m.Keys()
func (m *Map) Keys() []Key {
keys := make([]Key, 0, len(m.elements))
for elem := m.first; elem != nil; elem = elem.next {
keys = append(keys, elem.key)
}
return keys
}
// Values returns all values in the map. O(n) time and space.
//
// values := m.Values()
func (m *Map) Values() []Value {
values := make([]Value, 0, len(m.elements))
for elem := m.first; elem != nil; elem = elem.next {
values = append(values, elem.value)
}
return values
}
// SortKeys sorts keys in the map. O(n*log(n)) time, O(n) space.
// O(n*log(n)) time, O(n) space.
//
// m.SortKeys(func(a, b Key) bool {
// return a < b
// })
func (m *Map) SortKeys(less func(a, b Key) bool) {
if m.Len() < 2 {
return
}
elements := make([]*Element, 0, len(m.elements))
for elem := m.first; elem != nil; elem = elem.next {
elements = append(elements, elem)
}
sort.Slice(elements, func(i, j int) bool {
return less(elements[i].key, elements[j].key)
})
m.first = elements[0]
m.last = elements[len(elements)-1]
for i := 0; i < len(elements)-1; i++ {
elements[i].next = elements[i+1]
elements[i+1].prev = elements[i]
}
}