数据结构链表之符号表,Python3实现——8

数据结构链表之符号表

符号表的介绍

  • 之前章节介绍的顺序表和链表都是一个节点储存一个元素的表,但在日常生活中我们还有很多一次需要储存成对或多个值的情况,例如:
    在这里插入图片描述
  • 符号表最主要的目的将一对元素,用一个键和一个值将其联系起来,储存的值则是一个键和一个值共同组成的数据对,在查询元素时,我们只需要找到键即可查找到对应的元素
  • 符号表的键具有唯一性

符号表的实现

  • 可以用数组(Python中为列表)实现,也可以用链表实现,这里是链表,这里的节点实现和之前的链表实现有点不同,这里的节点有一个key、一个value还有一个next
  • 有序符号表的实现,有序符号表指按照键的一定顺序对符号表进行排列,有序符号表的实现过程可以参照下面的图例:
    在这里插入图片描述
    在使用python代码实现符号表之前,看一下我们之前定义的链表,是下面这样的:
    在这里插入图片描述
    这里的head可以当做一个名称,它总是代表第一个结点,当没有首结点时,它为None,也没有next.
    但本次我们将链表稍微修改一下,实现的链表是这样的:
    在这里插入图片描述
    这样子做是让代码写起来更加简洁易懂(可以省去很多需要单独对head结点进行的操作,实际上Java中的链表就是这样定义的)

主要用链表实现符号表的以下几个功能:

  1. size()获取符号表的大小
  2. show_items()以字典形式展示符号表中的元素
  3. put()将元素放入到符号表,需要考虑以键的顺序排列,重复键的value将会被替代
  4. delete()根据key来删除指定结点
  5. get_item()通过key获取对应结点的value

python代码实现

import operatorclass Node:def __init__(self, key, value):self.key = keyself.value = valueself.next = Noneclass SymbolTable:"""The head does not equal to the first element, but a none-value node"""def __init__(self):self.head = Node(None, None)self.len = 0def size(self):"""Length of this symbol table"""return self.lendef show_items(self):"""Show items in a dict"""items = {}cur = self.headwhile cur.next:cur = cur.nextitems[cur.key] = cur.valuereturn itemsdef put(self, _key, _value):"""Put element into the symbol table"""node = Node(_key, _value)cur = self.head.nextpre = self.headwhile cur and operator.gt(_key, cur.key):pre = curcur = cur.next# Key equals to _key, swap their valuesif cur and _key == cur.key:cur.value = _valuereturn# _key < cur.key or got to the endnode.next = curpre.next = nodeself.len += 1def delete(self, _key):"""Delete an element matched to the key"""pre = self.headcur = self.head.nextwhile cur:if _key == cur.key:pre.next = cur.nextself.len -= 1returnpre = curcur = cur.nextelse:raise ValueError('SymbolTable.delete(x): x not in table')def get_item(self, _key):"""Get a value matched to the key"""cur = self.headwhile cur.next:cur = cur.nextif _key == cur.key:return cur.value

功能测试

if __name__ == '__main__':ST = SymbolTable()key1 = 'f'key2 = 'g'key3 = 'h'key4 = 'e'print(f"Put a into key[{key1}]", ST.put(key1, 1))print(f"Put b into key[{key2}]", ST.put(key2, 2))print(f"Put c into key[{key3}]", ST.put(key3, 3))print(f"Put d into key[{key4}]", ST.put(key4, 4))print(f"Show items:", ST.show_items())key = 'g'ST.delete(key)print(f"Delete an element matched to key[{key}]", f"The items now is: {ST.show_items()}")print(f"Size: ", ST.size())key = 'f'print(f"Get value by key[{key}]:", ST.get_item(key))

结果:

Put a into key[f] None
Put b into key[g] None
Put c into key[h] None
Put d into key[e] None
Show items: {'e': 4, 'f': 1, 'g': 2, 'h': 3}
Delete an element matched to key[g] The items now is: {'e': 4, 'f': 1, 'h': 3}
Size:  3
Get value by key[f]: 1

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

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

相关文章

OpenCV_01 简介+无版权安装+模块分析

OpenCV是应用广泛的开源图像处理库&#xff0c;我们以其为基础&#xff0c;介绍相关的图像处理方法&#xff1a;包括基本的图像处理方法&#xff1a;几何变换&#xff0c;形态学变换&#xff0c;图像平滑&#xff0c;直方图操作&#xff0c;模板匹配&#xff0c;霍夫变换等&…

KMP 算法 学习 整理

我自己整理的KMP算法的PDF文件&#xff1a;http://pan.baidu.com/s/1o8yKIi2提取密码&#xff1a;8291 别的就不多说啥了&#xff0c;感谢来自海子 博客园的 资料-- 转载于:https://www.cnblogs.com/suishiguang/p/6285979.html

OpenCV_02 图像的基本操作:图像IO+绘制图形+像素点+属性+图像通道+色彩空间的改变

1 图像的IO操作 这里我们会给大家介绍如何读取图像&#xff0c;如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread()参数&#xff1a; 要读取的图像 读取方式的标志 cv.IMREAD*COLOR&#xff1a;以彩色模式加载图像&#xff0c;任何图像的透明度都将被忽略。这是默…

数据结构之树:树的介绍——9

数据结构之树&#xff0c;介绍篇 树的基本定义 介绍&#xff1a;树&#xff08;tree&#xff09;是计算机中非常重要的数据结构&#xff0c;它的外形看起来像一颗倒挂着的的树&#xff0c;使用树这种结构可以描述生活中很多的事物&#xff0c;如族谱&#xff0c;单位的组织架…

页面的宽度

页面的宽度等于内容 paddingmargin100%转载于:https://www.cnblogs.com/Zhaoyanguang/p/6292783.html

数据结构之二叉树:二叉查找树基本功能,Python代码实现——10

数据结构之二叉查找树的代码实现 定义 二叉查找树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;&#xff0c;是一种内存中特殊的树类型的存储结构&#xff0c;它允许对存储在其结点的数据进行增删改查&#xff0c;或者用作动态的数据集合&#xff0c;或是通过k…

OpenCV_03 图像的算数操作:图像的加法+图像的混合

1.图像的加法 你可以使用OpenCV的cv.add()函数把两幅图像相加&#xff0c;或者可以简单地通过numpy操作添加两个图像&#xff0c;如res img1 img2。两个图像应该具有相同的大小和类型&#xff0c;或者第二个图像可以是标量值。 注意&#xff1a;OpenCV加法和Numpy加法之间存…

【bzoj2806】 Ctsc2012—Cheat

http://www.lydsy.com/JudgeOnline/problem.php?id2806 (题目链接) 题意 给出M个字符串组成“标准库”。定义L表示将一个字符串分成若干段&#xff0c;每一段的长度不小于L&#xff0c;其中是在标准库中任一字符串的子串的字符“段”的长度之和不小于原字符串长度之和的90%。N…

怎样在Linux驱动中创建proc节点(示例)

一、定义proc节点的读、写函数 static int tp_switch_writeproc(struct file *file,const char *buffer, unsigned long count,void *data) { sscanf(buffer,"%d", &tp_dbg); printk("tpd: proc-->tp_dbg %d\n", tp_dbg); return count; } static …

数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)

数据结构之二叉查找树的代码实现 本节继续对上一节BST的功能实现 在实现之前&#xff0c;先对要实现的功能进行一下简单的介绍 BST的几种常见遍历方式 以一个简化的树为例&#xff0c;一棵树包含根(父)结点和其左子树及右子树&#xff1a; 遍历顺序的先后是指根(父)结点被遍…

OpenCV_04 几何变换:图像缩放+图像平移+图像旋转+仿射变换+透射变换+图像金字塔

1 图像缩放 缩放是对图像的大小进行调整&#xff0c;即使图像放大或缩小。 API cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)参数&#xff1a; src : 输入图像 dsize: 绝对尺寸&#xff0c;直接指定调整后图像的大小 fx,fy: 相对尺寸&#xff0c;将dsize设…

Direct2D教程(九)渲染位图

概述 这篇的标题更确切的说应该叫位图画刷&#xff0c;这样才好和前几篇对应起来。在Direct2D中&#xff0c;位图的渲染也是通过画刷来实现的。 Direct2D中并没有直接操作位图的接口&#xff0c;而是借助WIC&#xff08;Windows Image Component&#xff09;来完成的。今天我们…

OpenCV_05 形态学操作:连通性+腐蚀和膨胀+开闭运算+礼帽和黑帽

1 连通性 在图像中&#xff0c;最小的单位是像素&#xff0c;每个像素周围有8个邻接像素&#xff0c;常见的邻接关系有3种&#xff1a;4邻接、8邻接和D邻接。分别如下图所示&#xff1a; 4邻接&#xff1a;像素p(x,y)的4邻域是&#xff1a;(x1,y)&#xff1b;(x-1,y)&#xff…

数据结构之二叉树:折纸问题——11

数据结构之二叉树&#xff1a;Python代码解决折纸问题 折纸问题 要求&#xff1a;请把一段纸条竖着放在桌子上&#xff0c;然后从纸条的下边向上方对折1次&#xff0c;压出折痕后展开。此时折痕是凹下去的&#xff0c;即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

1 图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染&#xff0c;妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。 1.1 椒盐噪声 椒盐噪声也称为脉冲噪声&#xff0c;是图像中经常见到的一种噪声&#xff0c;它是一种随机出现的白…

Android kernel Crash后,定位出错点的方法

1. 将/prebuild/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb 拷贝到/usr/local/bin下 2. 进入out/target/product/工程名xxx/obj/KERNEL_OBJ 目录,找到文件vmlinux

Vuejs 写法实例

原文地址&#xff1a;http://www.jianshu.com/p/293387d240b2 Hello World <div id"app">{{ message }}<button v-on:click"clickMe()">点击</button> <button v-on:click"clickMe">无参数的简写</button> </d…

数据结构之堆:堆的介绍与python实现——12

堆的简单实现与代码实现 堆的定义 在定义堆&#xff08;heap&#xff09;之前&#xff0c;先回顾一下完全二叉树的定义&#xff1a; 完全二叉树&#xff1a;除了最后一层的结点有可能没有达到最大值外&#xff0c;其它层的结点值都达到最大值&#xff0c;此外最后一层的叶子…

OpenCV_07 直方图:灰度直方图+直方图均衡化

1 灰度直方图 1.1 原理 直方图是对数据进行统计的一种方法&#xff0c;并且将统计值组织到一系列实现定义好的 bin 当中。其中&#xff0c; bin 为直方图中经常用到的一个概念&#xff0c;可以译为 “直条” 或 “组距”&#xff0c;其数值是从数据中计算出的特征统计量&…

OpenCV_08 边缘检测:Sobel检测算子+Laplacian算子+Canny边缘检测

1 原理 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示&#xff1a; 图像边缘检测大幅度地减少了数据量&#xff0c;并且剔除了可以…