yck*_*art 6 javascript performance colors levenshtein-distance
我尝试根据给定的十六进制值获得最匹配的颜色名称.例如,如果我们有六角颜色,#f00我们就得到颜色名称red.
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
Run Code Online (Sandbox Code Playgroud)
我目前使用levenshtein距离算法来获得最接近的颜色名称,到目前为止效果很好,但有时并不像预期的那样.
例如:
'#0769ad' => 'chocolate'
'#00aaee' => 'mediumspringgreen'
Run Code Online (Sandbox Code Playgroud)
那么任何想法如何让结果更接近?
这是我为获得最接近的颜色而做的:
Array.closest = (function () {
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
function levDist(s, t) {
if (!s.length) return t.length;
if (!t.length) return s.length;
return Math.min(
levDist(s.substring(1), t) + 1,
levDist(t.substring(1), s) + 1,
levDist(s.substring(1), t.substring(1)) + (s[0] !== t[0] ? 1 : 0)
);
}
return function (arr, str) {
// http://stackoverflow.com/q/11919065/1250044#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
Run Code Online (Sandbox Code Playgroud)
http://jsfiddle.net/ARTsinn/JUZVd/2/
另一件事就是表现!似乎有一个非常大的问题使得这个问题非常缓慢(算法是什么?).
Levenshtein距离在这里并不合适,因为它会逐字逐句地比较.您需要单独检查每一个颜色,你想79成为更接近80比00.
以下内容似乎更接近您想要的内容,只需对代码进行最少的更改:
Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
return arr.sort(function (a, b) {
return dist(a, str) - dist(b, str);
});
};
}());
Run Code Online (Sandbox Code Playgroud)
请注意,这只会在两个s和t6个字符的颜色十六进制代码时给出合理的结果.
您的代码效率低下,因为您不需要对整个数组进行排序以获得最接近的颜色.您应该只是循环遍历数组并跟踪最短距离.
例如:
Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
var min = 0xffffff;
var best, current, i;
for (i = 0; i < arr.length; i++) {
current = dist(arr[i], str)
if (current < min) {
min = current
best = arr[i];
}
}
return best;
};
}());
Run Code Online (Sandbox Code Playgroud)
请注意,在此更改Array.closest()后将返回单个值而不是数组,因此您需要[0]在代码中删除更下面的值.
| 归档时间: |
|
| 查看次数: |
2648 次 |
| 最近记录: |