当前位置: 首页 > news >正文

广州企业网站seo网络推广的途径有哪些

广州企业网站seo,网络推广的途径有哪些,网络营销策略4p4c,小红书推广方式文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条… 文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条件,告警信息关联预案配置构成事件,也就是流程启动的入口信息. 业务界面 技术细节 其实也没有什么特殊的技术,也就用到了多叉树、图、最长路径计算(深搜)等. 多叉树 import lombok.Data;import java.util.ArrayList; import java.util.List;/*** author zwmac*/ Data public class MoreParentTreeNodeT {/*** 节点的唯一标识符*/private Long id;/*** 节点的名称*/private String name;/*** 节点的索引*/private Integer index;/*** 子节点list*/private ListMoreParentTreeNodeT children;/*** 父节点list*/private ListMoreParentTreeNodeT parents;/*** 扩展信息(一般就存节点对应的原始数据)*/private T extendInfo;public MoreParentTreeNode(Long id, String name,Integer index) {this.id id;this.name name;this.index index;this.children new ArrayList();this.parents new ArrayList();}public MoreParentTreeNode() {}/*** 添加子节点* param child 子节点*/public void addChild(MoreParentTreeNodeT child) {if (this.children.contains(child)) {return;}this.children.add(child);child.parents.add(this);}/*** 添加父节点* param parent 父节点*/public void addParent(MoreParentTreeNodeT parent) {if (this.parents.contains(parent)) {return;}this.parents.add(parent);parent.children.add(this);}public void traverse() {System.out.println(this.name); // 打印节点名称if (this.children.isEmpty()) {System.out.println(没有子节点);}for (MoreParentTreeNodeT child : this.children) {child.traverse(); // 递归遍历子节点}}public static void main(String[] args) {MoreParentTreeNode root new MoreParentTreeNode(1L, root,1);MoreParentTreeNode node1 new MoreParentTreeNode(2L, node1,2);MoreParentTreeNode node2 new MoreParentTreeNode(3L, node2,3);MoreParentTreeNode node3 new MoreParentTreeNode(4L, node3,4);MoreParentTreeNode node4 new MoreParentTreeNode(5L, node4,5);MoreParentTreeNode node5 new MoreParentTreeNode(5L, node5,6);MoreParentTreeNode node6 new MoreParentTreeNode(6L, node6,7);root.addChild(node1);root.addChild(node2);node1.addChild(node6);node3.addParent(node2);node4.addParent(node2);node4.addParent(node1);node5.addParent(node4);root.traverse();} } 图对象与计算基本方法 import lombok.Data;import java.util.ArrayList; import java.util.Arrays; import java.util.List;/*** 流程图对象,用于计算最长执行时间* author zwmac*/ Data public class ProcessGraph {/*** 顶点个数*/private int numVertices;/*** 邻接表*/private ListListInteger adjList;/*** 顶点执行时间(边长)*/private Double[] executionTimes;/*** 构造函数* param numVertices 顶点个数* param executionTimes 顶点执行时间(边长)*/public ProcessGraph(int numVertices, Double[] executionTimes) {this.numVertices numVertices;this.executionTimes executionTimes;adjList new ArrayList(numVertices);for (int i 0; i numVertices; i) {adjList.add(new ArrayList());}}/*** 添加边* param src 源顶点* param dest 目标顶点*/public void addEdge(int src, int dest) {adjList.get(src).add(dest);}/*** 计算最长执行时间* return 最长执行时间*/public Double findMaxExecutionTime() {Double[] maxExecutionTimes new Double[numVertices];Arrays.fill(maxExecutionTimes, -1d);Double maxExecutionTime 0d;for (int i 0; i numVertices; i) {Double currentExecutionTime dfs(i, maxExecutionTimes);if (currentExecutionTime maxExecutionTime) {maxExecutionTime currentExecutionTime;}}return maxExecutionTime;}/*** 深度优先搜索* param vertex 顶点* param maxExecutionTimes 最长执行时间数组* return 最长执行时间*/private Double dfs(int vertex, Double[] maxExecutionTimes) {if (maxExecutionTimes[vertex] ! -1) {return maxExecutionTimes[vertex];}Double maxExecutionTime executionTimes[vertex];for (int neighbor : adjList.get(vertex)) {Double neighborExecutionTime dfs(neighbor, maxExecutionTimes);if (neighborExecutionTime executionTimes[vertex] maxExecutionTime) {maxExecutionTime neighborExecutionTime executionTimes[vertex];}}maxExecutionTimes[vertex] maxExecutionTime;return maxExecutionTime;}public static void main(String[] args) {Double[] executionTimes {0d,3d, 4d, 5d, 2d, 3d,0d};ProcessGraph graph new ProcessGraph(7, executionTimes);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(1, 4);graph.addEdge(2, 3);graph.addEdge(3, 5);graph.addEdge(3, 5);//graph.addEdge(3, 5);Double maxExecutionTime graph.findMaxExecutionTime();System.out.println(Max execution time: maxExecutionTime);} } 多叉树工具类 import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.json.JSONUtil; import com.smartPark.business.emergency.event.entity.EmergencyEventTask; import com.smartPark.business.emergency.event.entity.dto.EmergencyEventTaskDTO; import org.apache.commons.lang3.StringUtils;import java.util.*;/*** author zwmac*/ public class EventTaskTreeUtil {/*** 转换流程树* param eventTaskList 任务列表* return 流程树根节点*/public static MoreParentTreeNode? convertTreeDto(ListEmergencyEventTaskDTO eventTaskList) {MoreParentTreeNode? root new MoreParentTreeNode(0L,开始,0);EmergencyEventTaskDTO rootEventTaskDto new EmergencyEventTaskDTO();rootEventTaskDto.setTaskDuration(0d);MapLong, MoreParentTreeNode? nodeMap new HashMap();for (int i 0;i eventTaskList.size();i) {EmergencyEventTaskDTO eventTask eventTaskList.get(i);Long id eventTask.getId();String name eventTask.getTaskName();MoreParentTreeNodeEmergencyEventTaskDTO node new MoreParentTreeNode(id,name,(i1));node.setExtendInfo(eventTask);nodeMap.put(eventTask.getId(), node);}//处理父子关系(正)for (EmergencyEventTaskDTO eventTask : eventTaskList) {transNodeRef(eventTask, nodeMap, root);}//处理父子关系(反)for (int i eventTaskList.size() - 1;i -1; i--){EmergencyEventTaskDTO eventTask eventTaskList.get(i);transNodeRef(eventTask, nodeMap, root);}return root;}/*** 转换流程树* param eventTaskList 任务列表* return 流程树根节点*/public static MoreParentTreeNode? convertTree(ListEmergencyEventTask eventTaskList) {MoreParentTreeNode? root new MoreParentTreeNode(0L,开始,0);EmergencyEventTask rootEventTask new EmergencyEventTask();rootEventTask.setTaskDuration(0d);MapLong, MoreParentTreeNode? nodeMap new HashMap();for (int i 0;i eventTaskList.size();i) {EmergencyEventTask eventTask eventTaskList.get(i);Long id eventTask.getId();String name eventTask.getTaskName();MoreParentTreeNodeEmergencyEventTask node new MoreParentTreeNode(id,name,(i1));node.setExtendInfo(eventTask);nodeMap.put(eventTask.getId(), node);}//处理父子关系(正)for (EmergencyEventTask eventTask : eventTaskList) {EmergencyEventTaskDTO eventTaskDTO new EmergencyEventTaskDTO();BeanUtil.copyProperties(eventTask, eventTaskDTO);transNodeRef(eventTaskDTO, nodeMap, root);}//处理父子关系(反)for (int i eventTaskList.size() - 1;i -1; i--){EmergencyEventTask eventTask eventTaskList.get(i);EmergencyEventTaskDTO eventTaskDTO new EmergencyEventTaskDTO();BeanUtil.copyProperties(eventTask,eventTaskDTO);transNodeRef(eventTaskDTO, nodeMap, root);}return root;}/*** 转换节点关系* param eventTask 父级任务* param nodeMap 节点map* param root 根节点*/private static void transNodeRef(EmergencyEventTaskDTO eventTask, MapLong, MoreParentTreeNode? nodeMap, MoreParentTreeNode? root) {Long id eventTask.getId();MoreParentTreeNode? node nodeMap.get(id);if (node ! null){EmergencyEventTaskDTO eventTaskDTO new EmergencyEventTaskDTO();Object eventTaskObj node.getExtendInfo();if(eventTaskObj instanceof EmergencyEventTask) {EmergencyEventTask nodeEventTask (EmergencyEventTask) eventTaskObj;BeanUtil.copyProperties(nodeEventTask, eventTaskDTO);}String preIds eventTaskDTO.getBeforeTaskIds();if (StringUtils.isEmpty(preIds)){node.addParent(root);root.addChild(node);}else {String[] preIdsArr preIds.split(,);if (ArrayUtil.isNotEmpty(preIdsArr)){for (String preId : preIdsArr) {MoreParentTreeNode? preNode nodeMap.get(Long.valueOf(preId));//前置任务不为空if (preNode ! null){preNode.addChild(node);}}}}nodeMap.put(id, node);}}/*** 获取节点的子节点列表* param treeNode 节点* param eventTaskId 事件任务id* return 子节点列表*/public static List? extends MoreParentTreeNode? getNodeChildrenList(MoreParentTreeNode? treeNode, Long eventTaskId) {List? extends MoreParentTreeNode? childrenList itGetNodeChildrenList(treeNode, eventTaskId);if (CollectionUtil.isNotEmpty(childrenList)) {return childrenList;}childrenList itGetNodeParentList(treeNode, eventTaskId);return childrenList;}/*** 迭代获取节点的父节点列表* param moreParentTreeNode 父节点* param eventTaskId 事件任务id* return 父节点列表*/private static List? extends MoreParentTreeNode? itGetNodeParentList(MoreParentTreeNode? moreParentTreeNode, Long eventTaskId) {List? extends MoreParentTreeNode? children null;if (moreParentTreeNode.getId().equals(eventTaskId)){children moreParentTreeNode.getChildren();}else{List? extends MoreParentTreeNode? parentTreeNodes moreParentTreeNode.getParents();if(CollectionUtil.isNotEmpty(parentTreeNodes)) {for (MoreParentTreeNode? parentTreeNode : parentTreeNodes) {children itGetNodeParentList(parentTreeNode, eventTaskId);if (CollectionUtil.isNotEmpty(children)) {break;}}}}return children;}/*** 迭代获取节点的子节点列表* param moreParentTreeNode 子节点* param eventTaskId 事件任务id* return 子节点列表*/private static List? extends MoreParentTreeNode? itGetNodeChildrenList(MoreParentTreeNode? moreParentTreeNode, Long eventTaskId) {List? extends MoreParentTreeNode? children null;if (moreParentTreeNode.getId().equals(eventTaskId)){children moreParentTreeNode.getChildren();}else{List? extends MoreParentTreeNode? childrenChild moreParentTreeNode.getChildren();if(CollectionUtil.isNotEmpty(childrenChild)) {for (MoreParentTreeNode? parentTreeNode : childrenChild) {children itGetNodeChildrenList(parentTreeNode, eventTaskId);if (CollectionUtil.isNotEmpty(children)) {break;}}}}return children;}public static void main(String[] args) {ListEmergencyEventTaskDTO eventTaskList new ArrayList();initTestData(eventTaskList,9);System.out.println(JSONUtil.toJsonStr(eventTaskList));MoreParentTreeNode? treeNode convertTreeDto(eventTaskList);List? childrenList getNodeChildrenList(treeNode, 3L);treeNode.traverse();}private static void initTestData(ListEmergencyEventTaskDTO eventTaskList, int num) {for (int i 0;i num; i){EmergencyEventTaskDTO eventTask new EmergencyEventTaskDTO();eventTask.setId(Long.valueOf(i));eventTask.setTaskName(任务- (i 1));eventTask.setTaskDuration(RandomUtil.randomDouble(1,10));if (i 1){StringJoiner sj new StringJoiner(,);int n RandomUtil.randomInt(0,i);for(int j 0;j i - 1 - n;j){sj.add(String.valueOf(j1));}eventTask.setBeforeTaskIds(sj.toString());}eventTaskList.add(eventTask);}}} 使用思路也特别简单,实际就是将配置任务时只选择了节点上级任务的所有任务构成一个多叉树,然后跟这个树每个节点设置唯一编号,然后转化为图,计算最长路径作为事件的预计完成时间,最后就是各个任务节点的流转了. /*** 计算预计完成时间* param event 事件* return 预计完成时间*/private Date calPlanEndTime(EmergencyEvent event) {Date planStartTime event.getPlanStartTime();Date finalNow planStartTime;//先查询预案任务QueryWrapperEmergencyEventPlan eventPlanQw new QueryWrapper();eventPlanQw.eq(event_id_, event.getId());ListEmergencyEventPlan eventPlanList eventPlanService.list(eventPlanQw);if (CollectionUtil.isNotEmpty(eventPlanList)){//最终预计完成时间//再查询预案任务for (int i 0;i eventPlanList.size();i){QueryWrapperEmergencyEventTask eventTaskQw new QueryWrapper();eventTaskQw.eq(event_id_, event.getId());eventTaskQw.eq(event_plan_id_, eventPlanList.get(i).getId());ListEmergencyEventTask eventTaskList eventPlanTaskService.list(eventTaskQw);if (CollectionUtil.isNotEmpty(eventTaskList)){//再组织流程树MoreParentTreeNode? processTree EventTaskTreeUtil.convertTree(eventTaskList);//最后计算时间Date planTaskEndTime calEndTime(processTree, planStartTime, eventTaskList);if (planTaskEndTime.after(finalNow)){finalNow planTaskEndTime;}}}}return finalNow;}小结 后悔数据结构没有学好算法用的少,也有很大工具包直接提供,但是还是很有学的必要的      就随便写写,希望能帮到大家,uping!
http://www.hkea.cn/news/14469226/

相关文章:

  • 网站制作维护费 归属淄博抖音推广公司
  • 网站设计需求说明书用ps怎么做短视频网站
  • php做商城网站步骤品牌建设工作总结
  • 做网站需要懂什么软件工商局企业信息查询系统
  • 网站备案号在哪里查询西安SEO网站推广
  • 医疗营销网站建设网站推广工具工作室
  • 网站备案名称修改国外浏览器搜索引擎入口
  • 成都电商设计招聘网站广州网站建设定制费用
  • 珠海专业网站建设价格上海建设工程信息网站
  • 火星建站和八亿建站可以设计制作网页的软件
  • 公司网站建设价烟台市网站建设
  • 做数码后期上数码网站wordpress小插件下载地址
  • 1网站建设公司wordpress网站迁移教程
  • 服装网站ui设计西安专业网络推广公司
  • 专业网站制作的地方上海最新发布最新
  • 新洲建设局网站手机壳定制app
  • wordpress多站点开启应用商店手机版下载
  • 外贸建站源码安卓android下载安装
  • 徐州手机网站建设制作有些网站为什么会有弹窗
  • 购物网站 建站服务百度关键字推广费用
  • 医疗网站建设咨询网站 申请
  • 方案计划网站wordpress 主域名
  • 购物网站页面布局网页设计实验报告单
  • 带有数据库的网站模板上海市企业网站建设
  • 怎么和其它网站做友情链接设计网站大全有哪些
  • 网站建设技术教程百度怎样可以搜到自己的网站
  • 云建站规划图做平台app需要什么
  • 一个网站多台服务器全国工商企业查询网官网
  • 企业网站源码挣钱吗找工作室的网站
  • 深圳网站建设i9988企业网站产品分类多怎么做seo