Elasticsearch的聚集统计,可以进行各种统计分析

news2024/12/18 12:42:48

说明: Elasticsearch不仅是一个大数据搜索引擎,也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。

  1. 度量聚集(Metric aggregation):度量聚集可以用于计算搜索结果在某个字段上的数量统计指标,比如平均值、最大值、最小值、总和等。
  2. 桶聚集(Bucket aggregation):桶聚集可以在某个字段上划定一些区间,每个区间是一个“桶”,然后按照搜索结果的文档内容把文档归类到它所属的桶中,统计的结果能明确每个桶中有多少文档。桶聚集还可以嵌套其他的桶聚集或者度量聚集来进行一些复杂的指标计算。
  3. 管道聚集(Pipeline aggregation):管道聚集就是把桶聚集统计的结果作为输入来继续做聚集统计,会在桶聚集的结果中追加一些额外的统计数据。

1.1、平均值聚集

平均值聚集用来计算索引中某个数值字段的平均值,对索引sougoulog的字段rank求平均值的聚集请求如下。

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "rank_avg": {
      "avg": {
        "field": "rank",
        "missing": 0
      }
    }
  }
}

在这个请求中,aggs的参数使用了一个类型为avg的聚集,它会对rank字段求平均值,请求中的missing参数表示如果遇到rank字段为null的文档,则当作0计算。这一聚集被命名为rank_avg,当然得新建索引,添加数据。

1.2 最大值和最小值聚集

使用最大值和最小值聚集可以快速地得到搜索结果中某个数值字段的最大值、最小值,例如,获取rank字段的最大值的请求如下。

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "rank_max": {
      "max": {
        "field": "rank",
        "missing": 0
      }
    }
  }
}

同理,如果要得到rank字段的最小值,把聚集类型设置为min即可。

1.3 求和聚集

与平均值聚集类似,求和聚集可以让搜索结果在某个数值字段上求和。

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "rank_sum": {
      "sum": {
        "field": "rank",
        "missing": 0
      }
    }
  }
}

1.4 统计聚集统计

聚集可以一次性返回搜索结果在某个数值字段上的最大值、最小值、平均值、个数、总和。

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "rank_stats": {
      "stats": {
        "field": "rank",
        "missing": 0
      }
    }
  }
}

2.1 百分比聚集

百分比聚集用于近似地查看搜索结果中某个字段的百分比分布数据,你可以根据搜索结果清晰地看出某个值以内的数据在整体数据集中的占比。例如,对sougoulog的rank字段做百分比聚集的请求如下。

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "rank_percent": {
      "percentiles": {
        "field": "rank"
      }
    }
  }
}

2.2 百分比等级聚集

百分比等级聚集跟百分比聚集的参数恰好相反,传入一组值,就可以看到这个值以内的数据占整体数据的百分比。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "percent_ranks": {
      "percentile_ranks": {
        "field": "rank",
        "values": [ 10, 50 ]
      }
    }
  }
}

在这个聚集请求中,把聚集类型设置为percentile_ranks表示发起百分比等级聚集,values用来设置需要查看的rank值,可以得到以下结果。

"aggregations" : {
    "percent_ranks" : {
      "values" : {
        "10.0" : 82.98,
        "50.0" : 94.22
      }
    }
  }

这个结果表明,有82.98%的文档rank值小于等于10,有94.22%的文档rank值小于等于50。

2 桶聚集

桶聚集会按照某个字段划分出一些区间,把搜索结果的每个文档按照字段所在的区间划分到桶中,桶聚集会返回每个桶拥有的文档数目。桶的数目既可以用参数确定,也可以在执行过程中按照数据内容动态生成。桶的默认上限数目是65535,返回的桶数目超过这个数目会报错。另外,桶聚集可以嵌套其他的聚集来得到一些复杂的统计结果,度量聚集是不能嵌套其他子聚集的。

2.1 范围聚集范围

聚集需要你提供一组左闭右开的区间,在返回的结果中会得到搜索结果的某个字段落在每个区间的文档数目,参数from用于提供区间下界,to用于提供区间上界。统计的字段既可以是数值类型的字段也可以是日期类型的字段。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "range_rank": {
      "range": {
        "field": "rank",
        "ranges": [
          {
            "to": 20
          },
          {
            "from": 20,
            "to": 50
          },
          {
            "from": 50
          }
        ]
      }
    }
  }
}

此时的聚集类型为range,field设置了统计的字段为rank,ranges提供区间内容,得到的结果如下。

"aggregations" : {
    "range_rank" : {
      "buckets" : [
        {
          "key" : "*-20.0",
          "to" : 20.0,
          "doc_count" : 8895
        },
        {
          "key" : "20.0-50.0",
          "from" : 20.0,
          "to" : 50.0,
          "doc_count" : 521
        },
        {
          "key" : "50.0-*",
          "from" : 50.0,
          "doc_count" : 584
        }
      ]
    }
  }

这个结果表示,有8895个文档的rank值小于20,有521个文档的rank值大于等于20小于50,rank值大于等于50的文档有584个。

2.2 日期范围聚集

日期范围聚集是一种特殊的范围聚集,它要求统计的字段类型必须是日期类型,在索引test-3-2-1中保存的日期字段born用的是UTC时间,下面的代码会实现在这个born字段上做日期范围聚集。

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "aggs": {
    "range_rank": {
      "date_range": {
        "field": "born",
        "ranges": [
          {
            "from": "2020-09-11 00:00:00",
            "to": "2020-10-11 00:00:00"
          },
          {
            "from": "2020-10-11 00:00:00",
            "to": "2020-11-11 00:00:00"
          }
        ]
      }
    }
  }
}

2.3 直方图聚集

直方图聚集经常用于做一些柱状图和折线图的展示,它可以选择一个数值或日期字段,然后根据字段的最小值和区间步长生成一组区间,统计出每个区间的文档数目。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "histogram_rank": {
      "histogram": {
        "field": "rank",
        "interval": 400,
        "extended_bounds": {
          "min": 0,
          "max": 1500
        }
      }
    }
  }
}

上面的请求使用extended_bounds中的max设置区间的上限,使用min设置区间的下限

"aggregations" : {
    "histogram_rank" : {
      "buckets" : [
        {
          "key" : 0.0,
          "doc_count" : 9760
        },
        {
          "key" : 400.0,
          "doc_count" : 9
        },
        {
          "key" : 800.0,
          "doc_count" : 231
        },
        {
          "key" : 1200.0,
          "doc_count" : 0
        }
      ]
    }
  }

0表示0-400的数据,400表示4000-800的数据,其他依次类推。

2.4 日期直方图聚集

日期直方图聚集的功能和直方图聚集的基本一样,但它只能在日期字段上做聚集,常用于做时间维度的统计分析。使用它可以非常方便地设置时间间隔,既可以是固定长度的时间间隔,也可以是日历时间间隔,例如你想了解每个月文档的数量分布,由于大小月的关系,应该把时间间隔设置为month,而不是固定为30天。参数calendar_interval用于设置日历时间间隔,可选配置如下。
在这里插入图片描述
下面来尝试实现日期直方图聚集,只需要传入时间间隔就可以切分区间,不用像范围聚集那样需传入每个区间的边界。

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "aggs": {
    "range_rank": {
      "date_histogram": {
        "field": "born",
        "calendar_interval": "month",
        "time_zone": "+08:00"
      }
    }
  }
}

2.5 缺失聚集

使用缺失聚集可以很方便地统计出索引中某个字段缺失或者为空的文档数量。例如:

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "aggs": {
    "miss": {
      "missing": {
        "field": "age"
      }
    }
  }
}

该聚集请求直接返回age字段为空的文档数量。

2.6 过滤器聚集

过滤器聚集往往作为其他聚集的父聚集使用,它可以在其他的聚集开始之前去掉一些文档使其不纳入统计,但是过滤器聚集的过滤条件对搜索结果不起作用。也就是说,它只过滤聚集结果,不过滤搜索结果。例如:

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "filteraggs": {
      "filter": {
        "term": {
          "name.keyword": "张三"
        }
      },
      "aggs": {
        "names": {
          "terms": {
            "field": "name.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

在这个嵌套聚集请求中,先使用过滤器聚集只保留姓名为“张三”的文档,然后嵌套了词条聚集,聚集的结果只出现一个桶,但是搜索结果还是会返回所有的文档。这里设置了size为0没有展示搜索详情,但是如下所示total已经返回了全部文档总数。

2.7 多过滤器聚集

跟过滤器聚集相比,多过滤器聚集允许添加多个过滤条件,每个条件生成一个桶,聚集结果会返回每个桶匹配的文档数。你还可以把不属于任何过滤器的文档全部放入一个名为“other”的桶。例如:

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "filtersaggs": {
      "filters": {
        "other_bucket": true,
        "filters": {
          "zhang": {
            "match": {
              "name": "张"
            }
          },
          "wang": {
            "match": {
              "name": "王"
            }
          }
        }
      }
    }
  }
}

这个请求定义了两个过滤条件,分别用match搜索姓名包含“张”和“王”的文档,搜索的结果数会各自返回到桶中,other_bucket参数设置为true表示显示不属于任何过滤器的文档数到名为“other”的桶中

3、管道聚集

前面谈到的聚集都是对索引的文档数据进行统计,但是管道聚集统计的对象不是索引中的文档数据,它是对桶聚集产生的结果做进一步聚集从而得到一些新的统计结果。管道聚集需要你提供一个桶聚集的相对路径来确定统计的桶对象。根据管道聚集出现的位置,管道聚集可以分为父管道聚集和兄弟管道聚集。

3.1 平均桶聚集

假如你通过日期直方图聚集或直方图聚集产生了3个桶,现在你想对这3个桶的统计值取平均值并做展示,这时候就可以使用平均桶聚集,例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "date": {
      "date_histogram": {
        "field": "visittime",
        "fixed_interval": "4m"
      },
      "aggs": {
        "rank_avg": {
          "avg": {
            "field": "rank"
          }
        }
      }
    },
    "rank_sum":{
      "avg_bucket": {
        "buckets_path": "date>rank_avg"
      }
    }
  }
}

“buckets_path”: "date>rank_avg"表示执行顺序,先用date进行时间分割,后面都数据求平均值。

.3.2 求和桶聚集

除了可以对桶聚集的值求平均值,还可以使用sum_bucket对多个桶的值求和。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "date": {
      "date_histogram": {
        "field": "visittime",
        "fixed_interval": "4m"
      },
      "aggs": {
        "rank_sum": {
          "sum": {
            "field": "rank"
          }
        }
      }
    },
    "rank_sum":{
      "sum_bucket": {
        "buckets_path": "date>rank_sum"
      }
    }
  }
}

3.3 最大桶和最小桶聚集

最大桶和最小桶聚集分别用于求多个桶的最大值和最小值,使用方法与求和桶聚集类似。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "date": {
      "date_histogram": {
        "field": "visittime",
        "fixed_interval": "4m"
      },
      "aggs": {
        "rank_data": {
          "stats": {
            "field": "rank"
          }
        }
      }
    },
    "max_rank":{
      "max_bucket": {
        "buckets_path": "date>rank_data.max"
      }
    }
  }
}

3.4 差值聚集差值

聚集用于计算直方图聚集的相邻桶数据的增量值,它也是父管道聚集。例如:

POST sougoulog/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "date": {
      "date_histogram": {
        "field": "visittime",
        "fixed_interval": "4m"
      },
      "aggs": {
        "avg_rank": {
          "avg": {
            "field": "rank"
          }
        },
        "hb":{
          "derivative": {
            "buckets_path": "avg_rank"
          }
        }
      }
    }
  }
}

差值聚集可以用于计算相邻桶数据的环比增长值,因此从第二个桶开始才有统计结果,结果如下。

"aggregations" : {
    "date" : {
      "buckets" : [
        {
          "key_as_string" : "00:00:00",
          "key" : 0,
          "doc_count" : 4231,
          "avg_rank" : {
            "value" : 13.434885369888915
          }
        },
        {
          "key_as_string" : "00:04:00",
          "key" : 240000,
          "doc_count" : 4115,
          "avg_rank" : {
            "value" : 46.68262454434994
          },
          "hb" : {
            "value" : 33.247739174461024
          }
        },
        {
          "key_as_string" : "00:08:00",
          "key" : 480000,
          "doc_count" : 1654,
          "avg_rank" : {
            "value" : 47.66142684401451
          },
          "hb" : {
            "value" : 0.9788022996645651
          }
        }
      ]
    }
  }

6.3 使用fielddata聚集

text字段通过前面的讲解,你应该已经学会了Elasticsearch支持的各种常用的聚集方式,然而这些聚集请求的聚集字段均未使用text字段,原因是实现聚集统计时需要使用字段的doc value值,而text字段不支持doc value。为了让text字段也能做聚集统计,Elasticsearch给text字段提供了fielddata字段数据功能,使用该功能可以在内存中临时生成字段的doc value值,从而实现对text字段做聚集统计。字段数据是一种缓存机制,它会取出字段的值放入内存,可用于排序和聚集统计。

先建立一个映射fielddata-test,它只有一个text字段,在映射中开启字段数据功能。

PUT fielddata-test
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "fielddata": true
      }
    }
  }
}

然后向其中添加一条数据。

PUT fielddata-test/_doc/1
{
  "content":"hello php java"
}

尝试在这个text字段上做词条聚集。

POST fielddata-test/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "termdata": {
      "terms": {
        "field": "content",
        "size": 10
      }
    }
  }
}

要显示内存中的content字段数据所占用的大小,可以使用以下代码。

id                         host      ip        node   field   size
EijMhNrDSoy-Bbmo3W8JGA 127.0.0.1 127.0.0.1 node-1 content  512b

字段数据可能会消耗大量内存,为了防止内存被字段数据过度消耗,可以在elasticsearch.yml中使用indices.fielddata.cache.size配置字段数据消耗内存的上限,可以给定一个百分比值,也可以给定具体大小值,该参数配置完后需要重启集群才能生效。

除了内存上限的配置,还可以使用字段数据的断路器,它会评估一个请求使用字段数据消耗的内存量,如果消耗的内存量超过indices.breaker.request.limit中配置的数值,它就会终止该请求继续消耗内存,这种配置可以使用REST端点动态修改,代码如下。

PUT /_cluster/settings
{
  "persistent" : {
    "indices.breaker.request.limit" : "30%"
  }
}

6.4 给聚集请求添加后过滤器

给聚集请求添加后过滤器前面已经介绍过两种过滤器,一种是在布尔查询的过滤上下文中添加搜索条件,另一种是过滤器聚集。本节介绍的后过滤器与它们都有区别。
在这里插入图片描述
由于后过滤器是在生成聚集统计结果之后对搜索结果进行过滤,所以它对聚集统计的结果没有任何影响,你可以在聚集请求的后面添加一个后过滤器,例如:

POST test-3-2-1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "aggs": {
    "names": {
      "terms": {
        "field": "name.keyword",
        "size": 10
      }
    }
  },
  "post_filter": {
    "term": {
      "name.keyword": "张三"
    }
  }
}

这个请求把后过滤器的过滤条件放到了聚集请求的后面,表示搜索结果只显示名字为“张三”的数据,聚集统计的结果是索引的全部文档,代码如下。

"hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test-3-2-1",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : "1",
          "sex" : false,
          "name" : "张三",
          "born" : "2020-09-11 00:02:20",
          "location" : {
            "lat" : 41.12,
            "lon" : -71.34
          }
        }
      }
    ]
  },
  "aggregations" : {
    "names" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "王五",
          "doc_count" : 1
        },
        {
          "key" : "张三",
          "doc_count" : 1
        },
        {
          "key" : "赵二",
          "doc_count" : 1
        },
        {
          "key" : "李四",
          "doc_count" : 1
        }
      ]
    }
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python这些冷门特性,当初也没教啊

B站|公众号:啥都会一点的研究生 本期整理了Python中几个冷门甚至奇特但又一直存在的特性,一起看看吧 插播,更多文字总结指南实用工具科技前沿动态第一时间更新在公粽号【啥都会一点的研究生】 for-else if-else想必所有人都知道用来处理条…

内置式永磁同步电机复矢量电流调节器设计

导读:本期主要介绍永磁同步电机复矢量电流调节器。针对内置式永磁同步电机d、q轴电流存在动态耦合的问题,在基于有效磁链概念得到IPMSM的复矢量数学模型,设计出相应的复矢量电流调节器,实现了d、q轴电流的动态解耦。通过仿真验证所…

【C语言】每日一题(旋转数组)

旋转数组,链接奉上 目录 方法:创建额外的数组:整体思路:代码实现: 数组反转:整体思路:代码实现:小插曲: 方法: 创建额外的数组: 整体思路: 创建一个额外的…

【Dockerfile镜像实战】构建LNMP环境并运行Wordpress网站平台

这里写目录标题 一、项目背景和要求二、项目环境三、部署过程1)创建自定义网络2)部署NginxStep1 创建工作目录并上传相关软件包Step2 编写Dockerfile文件Step3 编写配置文件nginx.confStep4 创建nginx镜像Step5 运行容器 3)部署MysqlStep1 创…

【Axure高保真原型】可视化图表图标

今天和粉丝们免费分享可视化图表图标原型模板,包括柱状图、条形图、环形图、散点图、水波图等常用的可视化图表图标。 【原型效果】 【原型预览】 https://axhub.im/ax9/d402c647c82f9185/#c1 【原型下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载哦…

Node学习笔记之HTTP 模块

回顾:什么是客户端、什么是服务器? 在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块…

EC11编码器编码使用

文章目录 前要原理脉冲与定位功能硬件设计 编程轮询模式定时器Encoder模式 结束语 前要 关于EC11编码器的了解可以参考两篇文章,比较详细,在此就不多介绍了: 一篇文章带你了解——EC11编码器(关于硬件、原理图、上下拉等都有讲&…

linux性能分析(五)如何学习linux性能优化

一 如何学习linux性能优化 强调: 由于知识记忆曲线以及某些知识点不常用,所以一定要注重复习思考: 如何进行能力转义以及能力嫁接? --> 真正站在巨人的肩膀上性能调优的目的: 不影响系统稳定性的资源最大利用化补充: 性能…

Python:函数篇(每周练习)

编程题: Python第四章作业(初级) (educoder.net) 题一:无参无返回值函数 def print_hi_human(): # 函数名用小写字母print("人类,你好!")if __name__ __main__:print_hi_human() 题二&#…

一起学数据结构(11)——快速排序及其优化

上篇文章中,解释了插入排序、希尔排序、冒泡排序、堆排序及选择排序的原理及具体代码实现本片文章将针对快速排序,快速排序的几种优化方法、快速排序的非递归进行解释。 目录 1. 快速排序原理解析以及代码实现: 2. 如何保证相遇位置的值一…

智慧矿山:让AI算法提高未戴安全带识别率!

未穿戴安全带识别AI算法,作为智慧矿山的重要应用之一,不仅可以有效提高矿山工作人员的安全意识,还可以降低事故发生的概率。然而,识别准确率的提高一直是该算法面临的挑战之一。为了解决这个问题,研究人员不断努力探索…

vue3如何实现页面跳转?

首先、给元素绑点击事件 其次 写跳转路由 总结:一定不要忘了引入Router

UE5--物体卡片与材质入门

参考资料: 《Unreal Engine5 入门到精通》--左央 虚幻引擎5.2文档:https://docs.unrealengine.com/5.2/zh-CN/ 前言: 跟着左央老师的《Unreal Engine5 入门到精通》学习制作AI版胡闹厨房,把学习过程与学习到的东西归纳总结起来。 …

裸机与RTOS(概念、关系、区别)

目录 裸机 什么是裸机? 裸机开发的特点 STM32裸机开发 RTOS 什么是RTOS? RTOS技术的概念及特点 STM32中的RTOS 裸机开发与RTOS开发对比分析 裸机开发 RTOS开发 如何选择? 裸机 什么是裸机? 在嵌入式领域,…

【大数据】Kafka 实战教程(一)

Kafka 实战教程(一) 1.Kafka 介绍1.1. 主要功能1.2. 使用场景1.3 详细介绍1.3.1 消息传输流程1.3.2 Kafka 服务器消息存储策略1.3.3 与生产者的交互1.3.4 与消费者的交互 2.Kafka 生产者3.Kafka 消费者3.1 Kafka 消费模式3.1.1 At-most-once(…

手把手教你使用Express框架在Node服务端实现图片渲染

手把手教你使用Express框架在Node服务端实现图片渲染 1.前言2.node-canvas库3.搭建node服务端环境3.1 初始化项目3.2 使用内置http模块创建服务3.3 使用Express创建服务 4.服务端渲染图片4.1 创建Express路由4.2 绘制三角形4.3 静态资源中间件4.4 写入图片文件4.5 渲染Echarts图…

STM32,我想看单片机上的外设时钟,我怎么看?

一:在工程中加入rcc文件 首先需要加载我们的时钟函数的文件 stm32f10x_rcc.h 和 stm32f10x_rcc.c 文件 二:查看文件 在h头文件 尾部,有我们这个总线的函数 在函数体内,有我们这个宏定义的 外设时钟,我们拿就行了 APB2_…

【C++】C++11新特性之右值引用与移动语义

文章目录 一、左值与左值引用二、右值与右值引用三、 左值引用与右值引用比较四、右值引用使用场景和意义1.左值引用的短板2.移动构造和移动赋值3.STL中右值引用的使用 五、万能引用与完美转发1.万能引用2.完美转发 一、左值与左值引用 在C11之前,我们把数据分为常…

win10专业版驱动开发

我使用的系统版本如何下: 使用的visual studio为VS2019,使用的SDK,WDK如下: 在visual studio单个组件里选择SDK10.0.018362.0 在WDK里面选择版本为: 下载链接如下: 以前的 WDK 版本和其他下载 - Windows drivers | Microsoft Le…

计算机算法分析与设计(16)---Dijkstra算法(含C++代码)

文章目录 一、知识概述1.1 算法描述1.2 例题分析 二、代码编写 一、知识概述 1.1 算法描述 1.2 例题分析 二、代码编写 输入:  第一行:图的顶点数n  第二行:图的边数k  第三行:算法起点begin,算法终点end  接下来…