之间的映射,实现高效的元素
查询。具体而  言,我们向哈希表中输入一个键 key ,则可以在 ?(1) 时间内获取对应的值 value 。  如图 6‑1 所示,给定 ? 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个 学号,返回对应的姓名”的
查询功能,则可以采用图 6‑1 所示的哈希表来实现。  图 6‑1 哈希表的抽象表示  除哈希表外,数组和链表也可以实现
查询功能,它们的效率对比如表  6‑1 所示。  ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。  ‧ 
查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。  ‧ 删除元素:需要先
查询到元素,再从数组(链表)中删除,使用 ?(?) 时间。  表 6‑1 元素
查询效率对比  数组 链表 哈希表  查找元素 ?(?) ?(?) ?(1)  添加元素 ?(1) ?(1) (1) ?(1)  删除元素 ?(?) ?(?) ?(1)  观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。  6.1.1 哈希表常用操作  哈希表的常见操作包括:初始化、
查询操作、添加键值对和删除键值对等,示例代码如下:  第 6 章 哈希表 hello‑algo.com 116  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map
 0 码力 |
          379 页 |
          18.47 MB
          | 1 年前 3
  之间的映射,实现高效的元素
查询。具  体而言,我们向哈希表中输入一个键 key ,则可以在 ?(1) 时间内获取对应的值 value 。  如图 6‑1 所示,给定 ? 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个 学号,返回对应的姓名”的
查询功能,则可以采用图 6‑1 所示的哈希表来实现。  图 6‑1 哈希表的抽象表示  除哈希表外,数组和链表也可以实现
查询功能,它们的效率对比如表  6‑1 所示。  ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。  ‧ 
查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。  ‧ 删除元素:需要先
查询到元素,再从数组(链表)中删除,使用 ?(?) 时间。  表 6‑1 元素
查询效率对比  数组 链表 哈希表  查找元素 ?(?) ?(?) ?(1)  添加元素 ?(1) ?(1) (1) ?(1)  删除元素 ?(?) ?(?) ?(1)  观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。  6.1.1 哈希表常用操作  哈希表的常见操作包括:初始化、
查询操作、添加键值对和删除键值对等,示例代码如下:  第 6 章 哈希表 hello‑algo.com 116  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map
 0 码力 |
          378 页 |
          17.59 MB
          | 1 年前 3
  之间的映射,实现高效的元素查询。具体而言,我们向哈  希表输入一个 key ,则可以在 ?(1) 时间内获取对应的 value 。  以一个包含 ? 个学生的数据库为例,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入  一个学号,返回对应的姓名”的查询功能,则可以采用哈希表来实现。  Figure 6‑1. 哈希表的抽象表示  除哈希表外,我们还可以使用数组或链表实现查询功能。若将学生数据看作数组(链表)元素,则有: 看作数组(链表)元素,则有:  ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。  ‧ 查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。  ‧ 删除元素:需要先查询到元素,再从数组中删除,使用 ?(?) 时间。  数组 链表 哈希表  查找元素 ?(?) ?(?) ?(1)  添加元素 ?(1) ?(1) ?(1)  删除元素 ?( (1)  观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。  6. 散列表 hello‑algo.com 93  6.1.1. 哈希表常用操作  哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等。  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map map;  /* 添加操作
 0 码力 |
          343 页 |
          27.39 MB
          | 1 年前 3
  之间的映射,实现高效的元素查询。具体而  言,我们向哈希表中输入一个键 key ,则可以在 ?(1) 时间内获取对应的值 value 。  如图 6‑1 所示,给定 ? 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个 学号,返回对应的姓名”的查询功能,则可以采用图 6‑1 所示的哈希表来实现。  图 6‑1 哈希表的抽象表示  除哈希表外,数组和链表也可以实现查询功能,它们的效率对比如表  6‑1 所示。  ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。  ‧ 查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。  ‧ 删除元素:需要先查询到元素,再从数组(链表)中删除,使用 ?(?) 时间。  表 6‑1 元素查询效率对比  数组 链表 哈希表  查找元素 ?(?) ?(?) ?(1)  添加元素 ?(1) ?(1) (1) ?(1)  删除元素 ?(?) ?(?) ?(1)  观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。  6.1.1 哈希表常用操作  哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等,示例代码如下:  第 6 章 哈希表 www.hello‑algo.com 116  // === File: hash_map.cpp ===  /* 初始化哈希表 */
 0 码力 |
          379 页 |
          18.48 MB
          | 10 月前 3
  之间的映射,实现高效的元素查询。具  体而言,我们向哈希表输入一个键 key ,则可以在 ?(1) 时间内获取对应的值 value 。  如图 6‑1 所示,给定 ? 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个 学号,返回对应的姓名”的查询功能,则可以采用图 6‑1 所示的哈希表来实现。  图 6‑1 哈希表的抽象表示  除哈希表外,数组和链表也可以实现查询功能,它们的效率对比如表  6‑1 所示。  ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。  ‧ 查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。  ‧ 删除元素:需要先查询到元素,再从数组(链表)中删除,使用 ?(?) 时间。  表 6‑1 元素查询效率对比  数组 链表 哈希表  查找元素 ?(?) ?(?) ?(1)  添加元素 ?(1) ?(1)  观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。  第 6 章 哈希表 hello‑algo.com 111  6.1.1 哈希表常用操作  哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等。  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map map;  /* 添加操作
 0 码力 |
          377 页 |
          30.69 MB
          | 1 年前 3
  如果从数据结构与算法的角度看,大大小小的「积木」就是数据结构,而「拼装说明书」上的一系列步骤就是  算法。  例二:查字典。在字典中,每个汉字都有一个对应的拼音,而字典是按照拼音的英文字母表顺序排列的。假设  需要在字典中查询任意一个拼音首字母为 ? 的字,一般我们会这样做:  1. 打开字典大致一半页数的位置,查看此页的首字母是什么(假设为 ? );  2. 由于在英文字母表中 ? 在 ? 的后面,因此应排除字典前半部分,查找范围仅剩后半部分; key ,在哈  希表中查询并获取 value ,时间复杂度为 ?(1) 。  例如,给定一个包含 ? 个学生的数据库,每个学生有“姓名 name ”和“学号 id ”两项数据,希望实现一个查  询功能:输入一个学号,返回对应的姓名,则可以使用哈希表实现。  Figure 6‑1. 哈希表的抽象表示  6.1.1. 哈希表效率  除了哈希表之外,还可以使用以下数据结构来实现上述查询功能:  1. 无序数组:每个元素为 插入元素 ?(1) ?(?) ?(1) ?(log ?) ?(1)  删除元素 ?(?) ?(?) ?(?) ?(log ?) ?(1)  6.1.2. 哈希表常用操作  哈希表的基本操作包括 初始化、查询操作、添加与删除键值对。  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map map;  /* 添加操作
 0 码力 |
          197 页 |
          15.72 MB
          | 1 年前 3
  如果从数据结构与算法的角度看,大大小小的「积木」就是数据结构,而「拼装说明书」上的一系列步骤就是  算法。  例二:查字典。在字典中,每个汉字都有一个对应的拼音,而字典是按照拼音的英文字母表顺序排列的。假设  需要在字典中查询任意一个拼音首字母为 ? 的字,一般我们会这样做:  1. 打开字典大致一半页数的位置,查看此页的首字母是什么(假设为 ? );  2. 由于在英文字母表中 ? 在 ? 的后面,因此应排除字典前半部分,查找范围仅剩后半部分; key ,在哈  希表中查询并获取 value ,时间复杂度为 ?(1) 。  例如,给定一个包含 ? 个学生的数据库,每个学生有“姓名 name ”和“学号 id ”两项数据,希望实现一个查  询功能:输入一个学号,返回对应的姓名,则可以使用哈希表实现。  Figure 6‑1. 哈希表的抽象表示  6.1.1. 哈希表效率  除了哈希表之外,还可以使用以下数据结构来实现上述查询功能:  1. 无序数组:每个元素为 插入元素 ?(1) ?(?) ?(1) ?(log ?) ?(1)  删除元素 ?(?) ?(?) ?(?) ?(log ?) ?(1)  6.1.2. 哈希表常用操作  哈希表的基本操作包括 初始化、查询操作、添加与删除键值对。  // === File: hash_map.cpp ===  /* 初始化哈希表 */  unordered_map map;  /* 添加操作
 0 码力 |
          187 页 |
          14.71 MB
          | 1 年前 3
  b.insert(3); • 等价于 • auto tmp = b.insert(3); • auto ok = tmp.first; • auto it = tmp.second;  在 set 中查询元素是否存在  • set 有一个 find 函数。只需给定一个参  数,他会寻找 set 中与之相等的元素。  • 如果找到,则返回指向找到元素的迭代器  。  • 如果找不到,则返回 end() find(2) begin() end()  1 2 4  find(2) begin() end()  1 2 4  find(2) begin() end()  * * *  出错!  在 set 中查询元素是否存在  • 因此,可以用这个写法: • set.find(x) != set.end() • 来判断集合 set 中是否存在  元素 x 。  • 这是个固定的写法,虽然要  调用两个函数看起来好像挺 find(int const &val) const; • iterator end() const;  1 2 4  find(2) begin() end()  find(8)  在 set 中查询元素是否存在  • 还有一种更直观的写法: • set.count(x) != 0 • count 返回的是一个 int 类型,表示  集合中相等元素的个数。  • 等等,不是说 set 具有去重的功能,不会
 0 码力 |
          83 页 |
          10.23 MB
          | 1 年前 3
  << 和 hex 选项。 • 但是他的输出会保存到一个字符串里。 • 调用成员函数 .str() 就能取出这个字符串了。 • 之后这个字符串就可以用作其他用途,比如     printf 打印,或者用于查询数据库,都没问题。 • 这里比较无聊,最后还是直接输出到了 cout 。  stringstream 也可以取代 stoi  • 刚刚展示了 stringstream 模仿 cout 的方法。 • stringstream string 类里定义了一个静态常量 npos ,其值为 (size_t)-  1 。  • 我们使用时,可以用 std::string::npos 代替看起来很不专业的 -  1 。  • 因此,要查询一个字符串是否包含某一字符,可以写: 1. s.find(c) != string::npos 2. s.find(c) != s.npos 3. s.find(c) != (size_t)-1 4 ohello”.find(“lo”) +  4 。  • 此外还有 find(“str”, pos, len) 和 find(“str”.substr(0, len), pos)   等价,用于要查询的字符串已经确定长度,或者要查询的字符串是 个切片( string_view )的情况。若不指定这个长度 len ,则默认 是 C 语言的 0 结尾字符串, find 还要去求 len = strlen(“str”)
 0 码力 |
          162 页 |
          40.20 MB
          | 1 年前 3
  .html  find_package 命令用法举例  • find_package(OpenCV)  • 查找名为 OpenCV 的包,找不到不报错,事后可以通过 ${OpenCV_FOUND} 查询是否找到。  • find_package(OpenCV QUIET)  • 查找名为 OpenCV 的包,找不到不报错,也不打印任何信息。  • find_package(OpenCV REQUIRED) 查找名为 OpenCV 的包,找不到就报错,可具有 OpenCV::core 和 OpenCV::videoio 这两个  组件,没有这两组件不会报错,通过 ${OpenCV_core_FOUND} 查询是否找到 core 组件。  find_package 说是找“包”,到底是在找什么?  • find_package(OpenCV) 实际上是在找一个名为 OpenCVConfig.cmake 的文件。 find_package 命令指定版本  • find_package(OpenCV REQUIRED)  • 查找名为 OpenCV 的包,不限版本,事后可以通过 ${OpenCV_VERSION} 查询找到的版本。  • find_package(OpenCV 2.0.1 REQUIRED)  • 查找版本在 2.0.1 以上的 OpenCV 包( version >= 2.0.1 )。  • find_package(OpenCV
 0 码力 |
          56 页 |
          6.87 MB
          | 1 年前 3