记一次二叉树(多叉树)的深度和广度优先遍历在项目中的真实应用

技术类的项目-选品:为方便各业务模块在做营销活动时能够根据商家过往的行为数据快速根据条件筛选出符合条件的目标商家,从而实现推送精准化的营销活动。类似与构建商家画像平台。

 

 选品项目包含的模块:(1)数据源接入 (2)数据采集 (3)标签建立 (4)筛选商家

  

   整体流程图

 

3、执行筛选流程

(1) 调用筛选服务启动筛选任务: ADMarketingSelectionServiceImpl.executeSelection(long id, ADMarketingSelectionExecuteType executeType)->SelectionService.executeSelection()->

(2)调用筛选处理器执行开启筛选流程: SelectionProcessor.process()

(3)执行解析处理器:SelectionParserProcessorHandler.handler()

(4) 执行查询处理器:SelectionQueryProcessorHandler.handler()

(5) 执行聚合处理器:SelectionAggregationProcessorHandler.handler()

(6) 执行查询结果处理器: SelectionQueryOutputProcessorHandler.handler()

(7) 执行查询导出处理器:SelectionOutputProcessorHandler.handler()

 

 

我做的模块:复杂标签筛选模块

(1)复杂标签的定义:标签包含子标签,也有可能子标签中包含孙子标签,但是同一level的标签的关系是一致的,即并、或、差的关系

一个场景包含多个复杂标签的树形

 

public class ResultCondition {

    private long FatherId;
    private int relation;

    private List<Condition> conditions;

    public void setFatherId(long fatherId) {
        FatherId = fatherId;
    }

    public void setConditions(List<Condition> conditions) {
        this.conditions = conditions;
    }

    public long getFatherId() {
        return FatherId;
    }

    public int getRelation() {
        return relation;
    }

    public void setRelation(int relation) {
        this.relation = relation;
    }

    public List<Condition> getConditions() {
        return conditions;
    }
}

public class Condition {
    private long id;
    private String name;
    private int relation;
    private List<Condition> complexCondition;

    public Condition(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getRelation() {
        return relation;
    }

    public void setRelation(int relation) {
        this.relation = relation;
    }

    public List<Condition> getComplexCondition() {
        return complexCondition;
    }

    public void setComplexCondition(List<Condition> complexCondition) {
        this.complexCondition = complexCondition;
    }
}


public static Stack<ResultCondition> getBFS(ADMarketingSelectionScenesPO root) {
        Stack<ResultCondition> stack = new Stack<>();
        if (root == null) {
            return stack;
        }
        Queue<Condition> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                List<Condition> subList = new ArrayList<>();
                Condition condition = queue.poll();
                ResultCondition resultCondition = new ResultCondition();
                resultCondition.setFatherId(condition.getId());
                resultCondition.setRelation(condition.getRelation());
                if (condition.getComplexCondition() != null) {
                    for (Condition cd : condition.getComplexCondition()) {
                        queue.add(cd);
                        subList.add(cd);
                    }
                    resultCondition.setConditions(subList);
                    stack.push(resultCondition);
                }
            }
        }
        return stack;
    }

(3)此算法输入一个包含很多层的条件组合,输出一个包含ResultCondition元素的栈,图型如下:

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值