C#,数值计算——Hashtable的计算方法与源程序

 

1 文本格式

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer
{
    public abstract class Hashtable<K>
    {
        private int nhash { get; set; }
        private int nmax { get; set; }
        private int nn { get; set; }
        private int ng { get; set; }
        private int[] htable { get; set; }
        private int[] next { get; set; }
        private int[] garbg { get; set; }
        private ulong[] thehash { get; set; }

        public virtual ulong fn(K k) { return 0L; }

        public Hashtable(int nh, int nm)
        {
            nhash = nh;
            nmax = nm;
            nn = 0;
            ng = 0;
            htable = new int[nh];
            next = new int[nm];
            garbg = new int[nm];
            thehash = new ulong[nm];
            for (int j = 0; j < nh; j++)
            {
                htable[j] = -1;
            }
        }

        public int iget(K key)
        {
            //ulong pp = hash.fn(key);
            //ulong pp = new Hashfn1(nhash).fn(key);
            ulong pp = fn(key);

            int j = (int)(pp % (ulong)nhash);
            for (int k = htable[j]; k != -1; k = next[k])
            {
                if (thehash[k] == pp)
                {
                    return k;
                }
            }
            return -1;
        }

        public int iset(K key)
        {
            int kprev = 0;
            //ulong pp = new Hashfn1(nhash).fn(key);
            ulong pp = fn(key);
            int j = (int)(pp % (ulong)nhash);
            int k;
            if (htable[j] == -1)
            {
                k = ng > 0 ? garbg[--ng] : nn++;
                htable[j] = k;
            }
            else
            {
                k = htable[j];
                for (; k != -1; k = next[k])
                {
                    if (thehash[k] == pp)
                    {
                        return k;
                    }
                    kprev = k;
                }
                k = ng > 0 ? garbg[--ng] : nn++;
                next[kprev] = k;
            }
            if (k >= nmax)
            {
                throw new Exception("storing too many values");
            }
            thehash[k] = pp;
            next[k] = -1;
            return k;
        }


        public int ierase(K key)
        {
            //ulong pp = new Hashfn1(nhash).fn(key);
            ulong pp = fn(key);
            int j = (int)(pp % (ulong)nhash);
            if (htable[j] == -1)
            {
                return -1;
            }
            int kprev = -1;
            for (int k = htable[j]; k != -1; k = next[k])
            {
                if (thehash[k] == pp)
                {
                    if (kprev == -1)
                    {
                        htable[j] = next[k];
                    }
                    else
                    {
                        next[kprev] = next[k];
                    }
                    garbg[ng++] = k;
                    return k;
                }
                kprev = k;
            }
            return -1;
        }

        public int ireserve()
        {
            int k = ng > 0 ? garbg[--ng] : nn++;
            if (k >= nmax)
            {
                throw new Exception("reserving too many values");
            }
            next[k] = -2;
            return k;
        }

        public int irelinquish(int k)
        {
            if (next[k] != -2)
            {
                return -1;
            }
            garbg[ng++] = k;
            return k;
        }
    }
}
 

2 代码格式

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer
{public abstract class Hashtable<K>{private int nhash { get; set; }private int nmax { get; set; }private int nn { get; set; }private int ng { get; set; }private int[] htable { get; set; }private int[] next { get; set; }private int[] garbg { get; set; }private ulong[] thehash { get; set; }public virtual ulong fn(K k) { return 0L; }public Hashtable(int nh, int nm){nhash = nh;nmax = nm;nn = 0;ng = 0;htable = new int[nh];next = new int[nm];garbg = new int[nm];thehash = new ulong[nm];for (int j = 0; j < nh; j++){htable[j] = -1;}}public int iget(K key){//ulong pp = hash.fn(key);//ulong pp = new Hashfn1(nhash).fn(key);ulong pp = fn(key);int j = (int)(pp % (ulong)nhash);for (int k = htable[j]; k != -1; k = next[k]){if (thehash[k] == pp){return k;}}return -1;}public int iset(K key){int kprev = 0;//ulong pp = new Hashfn1(nhash).fn(key);ulong pp = fn(key);int j = (int)(pp % (ulong)nhash);int k;if (htable[j] == -1){k = ng > 0 ? garbg[--ng] : nn++;htable[j] = k;}else{k = htable[j];for (; k != -1; k = next[k]){if (thehash[k] == pp){return k;}kprev = k;}k = ng > 0 ? garbg[--ng] : nn++;next[kprev] = k;}if (k >= nmax){throw new Exception("storing too many values");}thehash[k] = pp;next[k] = -1;return k;}public int ierase(K key){//ulong pp = new Hashfn1(nhash).fn(key);ulong pp = fn(key);int j = (int)(pp % (ulong)nhash);if (htable[j] == -1){return -1;}int kprev = -1;for (int k = htable[j]; k != -1; k = next[k]){if (thehash[k] == pp){if (kprev == -1){htable[j] = next[k];}else{next[kprev] = next[k];}garbg[ng++] = k;return k;}kprev = k;}return -1;}public int ireserve(){int k = ng > 0 ? garbg[--ng] : nn++;if (k >= nmax){throw new Exception("reserving too many values");}next[k] = -2;return k;}public int irelinquish(int k){if (next[k] != -2){return -1;}garbg[ng++] = k;return k;}}
}

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

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

相关文章

使用ROS与Movelt实现myCobot 280运动轨迹规划和控制

ROS的技术案例 Introduction 今天这篇文章将记录我使用myCobot 280 M5stack 在ROS当中是如何使用的。为什么使用ROS呢&#xff0c;因为提及到机器人都离不开ROS这个操作系统&#xff0c;今天是我们第一次使用ROS这个系统。 今天我将从ROS的介绍&#xff0c;环境的配置以及mycob…

JDK8源码阅读环境配置

说明 环境 jdk 版本&#xff1a;1.8.0_381 系统&#xff1a;macos 13.5.1 Intel 目的 学习 jdk8 源码&#xff0c;并能自定注释。 新建 java 工程 在 idea 中新建 java 工程&#xff0c;注意并非 maven 工程。如下图&#xff1a;完成后&#xff0c;如下图&#xff1a; 配置…

linux安装python3.x版本

linux安装python3.x版本 ① 安装依赖环境② 下载python版本包③ 安装python④ 建立软链接⑤ 加入path⑥ 验证 官网版本地址&#xff1a;https://www.python.org/ftp/python/ ① 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel…

第7章 【MySQL】B+树索引的使用

InnoDB存储引擎的B树索引&#xff1a; 每个索引都对应一棵 B 树&#xff0c; B 树分为好多层&#xff0c;最下边一层是叶子节点&#xff0c;其余的是内节点。所有 用户记录都存储在 B 树的叶子节点&#xff0c;所有 目录项记录 都存储在内节点。InnoDB 存储引擎会自动为主键&a…

06-Redis缓存高可用集群

上一篇&#xff1a;05-Redis高可用集群之水平扩展 1.集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c…

Seata四种事务模式AT、TCC、SAGA 、 XA详解

文章目录 一、 GlobalTransactional一、AT模式1、原理2 、优缺点3、实现 二、TCC模式1、原理2 、优缺点3、实现 三、SAGA模式1 、原理2 、优缺点3 、实现 四、XA模式1 、原理2 、优缺点3、 实现 五、 四种模式对比 我们知道Seata是一款开源的分布式事务解决方案&#xff0c;致力…

WebGoat搭建和Yakit学习

环境搭建 jdk版本&#xff1a;openjdk version "17.0.5“ WebGoat版本&#xff1a;webgoat-server-8.1.0.jar 环境不同有很大可能不能搭建成功 运行命令&#xff1a;java -jar webgoat-server-8.1.0.jar --server.port8888 --server.address192.168.142.131 搭建完成后…

电脑网速慢怎么解决?推荐这3个方法

在数字化时代&#xff0c;快速的互联网连接对于工作和娱乐都至关重要。然而&#xff0c;有时候我们可能会遇到电脑网速慢的问题&#xff0c;这会影响我们的效率和体验。可是电脑网速慢怎么解决呢&#xff1f;本文将介绍解决电脑网速慢的3个方法&#xff0c;帮助你提升网络连接的…

面经pc端项目

创建项目 安装脚手架-----创建项目------选择自定义 sass基础语法 https://www.sass.hk/ sass语法有两个:sass(旧) scss(新) 1.scss语法 和less语法类似,支持嵌套,支持变量… scss: $变量名 less: @变量名 $color:orange; .box{width: 400px;height: 400px;borde…

如何使用反 CSRF 令牌保护您的网站和 Web 应用程序

防止跨站点请求伪造攻击 (CSRF/XSRF)的最常见方法是使用反 CSRF 令牌&#xff0c;该令牌只是一个唯一值集&#xff0c;然后由 Web 应用程序需要。CSRF 是一种客户端攻击&#xff0c;可用于将用户重定向到恶意网站、窃取敏感信息或在用户会话中执行其他操作。幸运的是&#xff0…

python萌新爬虫学习笔记【建议收藏】

文章目录 1. 如何何请求解析url2. 如何获取标签里面的文本3. 如何解析JSON格式4. 如何添加常用的header5. 如何合并两个div6. 如何删除html dom的部分结构7. 如何一次性获取所有div标签里的文本8. python爬虫如何改变响应文本字符集编码9. 如何进行字符集转码11. response.text…

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向…