之间的映射,实现高效的元素
查询。具 体而言,我们向哈希表中输入一个键 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 114 // === File: hash_map.java === /* 初始化哈希表 */ Map
0 码力 |
376 页 |
17.59 MB
| 1 年前 3
之间的映射,实现高效的元素查询。具体而言,我们向哈 希表输入一个 key ,则可以在 ?(1) 时间内获取对应的 value 。 以一个包含 ? 个学生的数据库为例,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入 一个学号,返回对应的姓名”的查询功能,则可以采用哈希表来实现。 Figure 6‑1. 哈希表的抽象表示 除哈希表外,我们还可以使用数组或链表实现查询功能。若将学生数据看作数组(链表)元素,则有: 看作数组(链表)元素,则有: ‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用 ?(1) 时间。 ‧ 查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用 ?(?) 时间。 ‧ 删除元素:需要先查询到元素,再从数组中删除,使用 ?(?) 时间。 数组 链表 哈希表 查找元素 ?(?) ?(?) ?(1) 添加元素 ?(1) ?(1) ?(1) 删除元素 ?( (1) 观察发现,在哈希表中进行增删查改的时间复杂度都是 ?(1) ,非常高效。 6. 散列表 hello‑algo.com 92 6.1.1. 哈希表常用操作 哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等。 // === File: hash_map.java === /* 初始化哈希表 */ Map map = new HashMap<>();
0 码力 |
342 页 |
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 114 // === File: hash_map.java === /* 初始化哈希表 */
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 110 6.1.1 哈希表常用操作 哈希表的常见操作包括:初始化、查询操作、添加键值对和删除键值对等。 // === File: hash_map.java === /* 初始化哈希表 */ Map map = new HashMap<>();
0 码力 |
376 页 |
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.java === /* 初始化哈希表 */ Map map = new HashMap<>();
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.java === /* 初始化哈希表 */ Map map = new HashMap<>();
0 码力 |
186 页 |
14.71 MB
| 1 年前 3
名/密码及其角色;role.role1=permission1,permission2 指定角色及权限信息; org.apache.shiro.realm.jdbc.JdbcRealm:通过 sql 查询相应的信息,如“select password from users where username = ?”获取用户密码,“select password, password_salt from users 统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以 实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不 建议使用,可能造成查询权限及匹配变慢。可以考虑比如在 sql 查询时加上权限字符串之 类的方式在查询时就完成了权限匹配。 role75=user:*:* subject().checkPermissions("user:view:1", "user:auth:2"); 插入相关的权限数据; 2、使用 shiro-jdbc-authorizer.ini 配置文件,需要设置 jdbcRealm.permissionsLookupEnabled 为 true 来开启权限查询。 此次还要注意就是不能把我们自定义的如“+user1+10”配置到 INI 配置文件,即使有 IniRealm 完成,因为 IniRealm 在 new 完成后就会解析这些权限字符串,默认使用了
0 码力 |
219 页 |
4.16 MB
| 10 月前 3
o 提供了强大而直观的语法,我们称之为 WildcardPermission。 Simple Usage 假设你想要保护到贵公司打印机的访问,使得某些人能够打印到特定的打印机,而其他人可以查询当前有哪些工作 在队列中。 一个极其简单的方法是授予用户"queryPrinter"权限。然后你可以检查用户是否具有 queryPrinter 权限通过调用: subject.isPer printer:query 在这个例子中的冒号是一个特殊字符,它用来分隔权限字符串的下一部件。 在该例中,第一部分是权限被操作的领域(打印机),第二部分是被执行的操作(查询)。上面其他的例子将被改 为: printer:print printer:manage 对于能够使用的部件是没有数量限制的,因此 : printer:print, query 它能够赋予用户 print 和 query 打印机的能力。由于他们被授予了这两个操作,你可以通过调用下面的语句来判断用 户是否有能力查询打印机: subject.isPermitted("print:query") 该语句将会返回 true。 All Values 如果你想在一个特定的部件给某一用户授予所有
0 码力 |
92 页 |
1.16 MB
| 1 年前 3