@antv/algorithm
Version:
graph algorithm
61 lines (60 loc) • 1.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _util = require("@antv/util");
var _degree = _interopRequireDefault(require("./degree"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* k-core算法 找出符合指定核心度的紧密关联的子图结构
* @param graphData 图数据
* @param k 核心度数
*/
var kCore = function kCore(graphData, k) {
var _a;
if (k === void 0) {
k = 1;
}
var data = (0, _util.clone)(graphData);
var _b = data.nodes,
nodes = _b === void 0 ? [] : _b;
var _c = data.edges,
edges = _c === void 0 ? [] : _c;
var _loop_1 = function _loop_1() {
// 获取图中节点的度数
var degrees = (0, _degree.default)({
nodes: nodes,
edges: edges
});
var nodeIds = Object.keys(degrees);
// 按照度数进行排序
nodeIds.sort(function (a, b) {
var _a, _b;
return ((_a = degrees[a]) === null || _a === void 0 ? void 0 : _a.degree) - ((_b = degrees[b]) === null || _b === void 0 ? void 0 : _b.degree);
});
var minIndexId = nodeIds[0];
if (!nodes.length || ((_a = degrees[minIndexId]) === null || _a === void 0 ? void 0 : _a.degree) >= k) {
return "break";
}
var originIndex = nodes.findIndex(function (node) {
return node.id === minIndexId;
});
// 移除度数小于k的节点
nodes.splice(originIndex, 1);
// 移除度数小于k的节点相关的边
edges = edges.filter(function (edge) {
return !(edge.source === minIndexId || edge.target === minIndexId);
});
};
while (true) {
var state_1 = _loop_1();
if (state_1 === "break") break;
}
return {
nodes: nodes,
edges: edges
};
};
var _default = kCore;
exports.default = _default;