【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表

这篇具有很好参考价值的文章主要介绍了【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文的主要内容是 符号表(symbol table,以下简称 ST)。内容比较简单,只涉及到比较基础的实现,没有太过复杂的概念,因而篇幅比较短。

在 Sedgewick 教授的视频课程中对一些数学模型分析内容没有进行详细的证明,但在书中有比较详细的介绍,可以参考书中的相关章节进行学习总结。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《3.1 符号表》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

1:API

键值对抽象。

  • 插入带有指定键的值。
  • 给定一个键,可以查询到对应的值。

表3.1.1 典型的符号表应用
【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

关联数组抽象。

表3.1.2 一种简单的泛型符号表API
【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

1.1:遵循的规则

(这里列出书中对应的章节)

  • 3.1.1.1 泛型 Generics.
  • 3.1.1.2 重复的键 Duplicate keys.
  • 3.1.1.3 空(null)键
  • 3.1.1.4 空(null)值 Null values.
  • 3.1.1.5 删除操作 Deletion.
  • 3.1.1.6 便捷方法
  • 3.1.1.7 迭代 Iterators.
  • 3.1.1.8 键的等价性 Key equality.

其中教授着重提到的是重复键规则:

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

以及键的等价性:

(截图自官网)
【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

键的等价性这里给出的源码是 Person (传送门)。

这个类的定义遵循了上面所述的一些原则。

1.2:ST 用例举例

我们这里考察两个用例:一个用来跟踪算法在小规模输入下的行为测试用例,和一个用来寻找更高效的实现的性能测试用例。

1.2.1:行为测试用例

edu.princeton.cs.algs4.ST

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

1.2.2:性能测试用例

edu.princeton.cs.algs4.FrequencyCounter

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

main 方法有点长,我直接把 jar 包的源码贴上来:

	/**
     * Reads in a command-line integer and sequence of words from
     * standard input and prints out a word (whose length exceeds
     * the threshold) that occurs most frequently to standard output.
     * It also prints out the number of words whose length exceeds
     * the threshold and the number of distinct such words.
     * 
     * 中译:从标准输入读入命令行整数和单词序列,并将最常出现的单词 (其长度超过阈值) 打印到标准输出。
     * 它还打印出长度超过阈值的单词的数量以及不同的此类单词的数量。 
	 *
     * @param args the command-line arguments
     */
    public static void main(String[] args) {
        int distinct = 0, words = 0;
        int minlen = Integer.parseInt(args[0]);
        ST<String, Integer> st = new ST<String, Integer>();

        // compute frequency counts
        while (!StdIn.isEmpty()) {
            String key = StdIn.readString();
            if (key.length() < minlen) continue;
            words++;
            if (st.contains(key)) {
                st.put(key, st.get(key) + 1);
            }
            else {
                st.put(key, 1);
                distinct++;
            }
        }

        // find a key with the highest frequency count
        String max = "";
        st.put(max, 0);
        for (String word : st.keys()) {
            if (st.get(word) > st.get(max))
                max = word;
        }

        StdOut.println(max + " " + st.get(max));
        StdOut.println("distinct = " + distinct);
        StdOut.println("words    = " + words);
    }

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

2:基本实现

2.1:无序链表处理

对应章节:3.1.4 无序链表中的顺序查找

数据结构。维护键值对的(无序)链表。

搜索。扫描所有的键,直到找到一个匹配。
插入。扫描所有键,直到找到匹配项;如果没有匹配,则添加到前面。

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

edu.princeton.cs.algs4.SequentialSearchST

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

2.2:初级ST实现小结

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

2.3:有序数组的二分查找

对应章节:3.1.5 有序数组中的二分查找

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

2.4:二分查找 Java 代码实现

edu.princeton.cs.algs4.BinarySearchST

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

edu.princeton.cs.algs4.BinarySearchST#get

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

edu.princeton.cs.algs4.BinarySearchST#rank

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

需要注意的问题:在插入新值的时候,需要和所有较大的key进行交换。

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

2.5:初级ST实现小结

【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

书里面也有汉化表格:

表3.1.10 简单的符号表实现的成本总结
【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

3:排序操作

表3.1.4 一种有序的泛型符号表的API
【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表,算法学习,算法,java

(完)文章来源地址https://www.toymoban.com/news/detail-829589.html

到了这里,关于【Algorithms 4】算法(第4版)学习笔记 08 - 3.1 符号表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读改变未来的九大算法笔记08_并非万能的算法

    2.1.1.1. Alonzo Church 2.1.1.2. 在计算理论上的突破性工作至今仍是计算机科学许多方面的基础 2.1.1.3. 单独发现了不可判定问题的存在 2.1.1.3.1. 比图灵早几个月发表了自己的成果 2.1.1.3.2. 邱奇的公式更为抽象,且并未详尽地提及由机器执行的计算 5.3.1.1. 如果输入会崩溃,那么

    2024年02月08日
    浏览(27)
  • 吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

    3.1 神经网络概述(Neural Network Overview) 本周你将学习如何实现一个神经网络。在我们深入学习具体技术之前,我希望快速的带你预览一下本周你将会学到的东西。如果这个视频中的某些细节你没有看懂你也不用担心,我们将在后面的几个视频中深入讨论技术细节。 现在我们

    2024年03月23日
    浏览(29)
  • MySql学习笔记08——事务介绍

    事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。 一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。 由于只有DML语句中才会有事务的概念,因此事务只和 insert update delete 语句有关。 说到

    2024年02月09日
    浏览(29)
  • 十大排序算法(Top 10 Sorting Algorithms)

    十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因

    2024年02月08日
    浏览(36)
  • Sorting Algorithms in Python (排序算法)

    本篇文章主要介绍几种经典排序算法:冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、桶排序和基数排序。并给出用python实现的算法代码。 目录 一、冒泡排序 二、快速排序 三、选择排序 四、堆排序 五、插入排序 六、希尔排序 七、归并排序 八

    2024年04月15日
    浏览(30)
  • 大模型学习笔记08——分布式训练

    模型规模的扩大,对硬件(算力、内存)的发展提出要求。然而,因为内存墙的存在,单一设备的算力及容量,受限于物理定律,持续提高芯片的集成越来越困难,难以跟上模型扩大的需求。 为了解决算力增速不足的问题,人们考虑用多节点集群进行分布式训练,以提升算力

    2024年01月23日
    浏览(33)
  • WPF实战学习笔记08-创建数据库

    创建文件夹 ./Context 创建文件 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs ./Context/Todo.cs ./Context/User.cs 创建数据对象 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs 创建数据库DbSet ./Context/Todo.cs ./Context/User.cs 添加nuget包 Microsoft.EntityFrameworkCore.Design Shared design-time co

    2024年02月16日
    浏览(32)
  • 立创eda学习笔记五:如何自己画器件的符号和封装并上传

    立创eda画符号和封装很方便的,一般是先画符号,再画封装,再关联起来。 这里的符号是电气符号,即原理图里面用到的表示一个电气器件的电气符号。 这里的封装不是指的引脚封装图,而是放到pcb板上进行焊接时用的焊盘封装图。 其实主要的资料在立创eda推出的使用教程

    2023年04月14日
    浏览(109)
  • 【自学笔记】01Java基础-08Java常用API:03日期类详解

    记录Java基础-常用API-有关时间日期的类。 1.1 什么是Date类 Date 类位于 java.util 包中,代表当前所在系统的日期时间信息或表示特定的瞬间,精确到毫秒。 这个类在早期版本的 Java 中被广泛使用,但由于其功能和设计的局限性,自Java8起,推荐使用 java.time 包中的新日期和时间

    2024年01月22日
    浏览(25)
  • ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

    新找到一篇文,也比较全 swift 5.1语法 1小时入门 下面是Swift语言中的常见及其说明和代码应用实例: class:定义一个类,用于封装一组相关的属性和方法。 示例代码: struct:定义一个结构体,用于封装一组相关的值类型数据。 示例代码: enum:定义一个枚举类型,用

    2023年04月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包