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.rhkb.cn/news/135417.html

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

相关文章

C# 实现迷宫游戏

智能提示&#xff1a; /// <summary>/// 迷宫/// </summary>internal class Maze : IDisposable{private MazeCell[,] cells;private readonly Stack<MazeCell> stack new Stack<MazeCell>();private readonly Random rand new Random();private int…

Nvm任意切换node版本号

前言&#xff1a; nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具。它允许您在同一台计算机上同时安装和切换不同版本的Node.js。使用nvm&#xff0c;您可以轻松地在项目之间切换Node.js版本&#xff0c;而无需手动安装和卸载不同的版本。这…

简单的手机电脑无线传输方案(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server abstract windows访问android文件 android访问桌面系统上的文件 windows浏览android文件 环境准备 客户端软件 android手机…

Nginx限制每秒请求次数,限制每秒连接次数,下载速度限制

Nginx限制每秒请求次数,限制每秒连接次数,下载速度限制。 为了防止网站被恶意攻击,总是需要做一些防护措施 最外层的web服务器是Nginx,于是寻找 nginx 的一些关于防护措施的配置,记录在此 一些变量 首先列举出会使用到的一些变量 限制请求数 首先需要定义限制区域,在…

leetcode 817. 链表组件(java)

链表组件 题目描述HashSet 模拟 题目描述 给定链表头结点 head&#xff0c;该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums&#xff0c;该列表是上述链表中整型值的一个子集。 返回列表 nums 中组件的个数&#xff0c;这里对组件的定义为&#xff1a;链表中一段…

FPGA project : dht11 温湿度传感器

没有硬件&#xff0c;过几天上板测试。 module dht11(input wire sys_clk ,input wire sys_rst_n ,input wire key ,inout wire dht11 ,output wire ds ,output wire …

安卓判断是否是模拟器,适配主流雷电,MUMU,夜神,逍遥

前言 最近游戏项目组又有新的要求&#xff0c;对于数据上报和数据统计接口&#xff0c;尽可能的具体化&#xff0c;比如是否是模拟器&#xff0c;模拟器的型号&#xff0c;品牌等&#xff0c;都要求统计&#xff0c;后续模拟器玩家在活动发放&#xff0c;安全风控等方面也易于…

uniapp开发小程序中实现骨架屏

第一步&#xff1a;小程序中实现骨架屏在微信开发者工具中点击生成骨架屏&#xff1a; 第二步&#xff1a;复制html代码&#xff0c;到骨架屏vue组件汇中再把之前写的样式代码引入进去&#xff1a; import ../../pages/user/user.css; 第三步&#xff1a;组件中引入骨架屏&am…

【干货】有效削减工厂“隐性”成本的策略

导读 在资源限制条件下&#xff0c;通过企业成本管理提高资源的利用效率&#xff0c;使有限的经济资源生产出更多的产品、创造出更多的价值&#xff0c;达到节约增产的目的&#xff0c;也是企业成本管理的重要目标。通过对大多数企业进行调研&#xff0c;发现企业成本在以下方…

大数据-玩转数据-Flink CEP编程

一、Flink CEP FlinkCEP(Complex event processing for Flink) 是在Flink实现的复杂事件处理库。它可以让你在无界流中检测出特定的数据&#xff0c;有机会掌握数据中重要的那部分。 是一种基于动态环境中事件流的分析技术&#xff0c;事件在这里通常是有意义的状态变化&#…

JDK8源码阅读环境配置

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

kali搭建vulhub漏洞靶场

安装kali 下载kali作为虚拟环境&#xff0c; Get Kali | Kali Linux 通过vmvare打开&#xff0c;默认账号密码kali/kali 修改root密码 su passwd root 如果一些配置普通用户做不了就切换kali&#xff0c;或sudo 命令 kali配置 apt换源 echo > /etc/apt/sources.list v…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象&#xff0c;它提供了一种方法来表示大于2^53 - 1的整数&#xff0c;通俗来讲就是提供了一种可以表示任意大整数的方法&#xff0c;当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候&#xff0c;会出错。所以此时我们需要使用Big…

LinkedList 源码分析

LinkedList 是一个基于双向链表实现的集合类。 LinkedList 插入和删除元素的时间复杂度 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O(1)。尾部插入/删除&#xff1a;只需要修改尾结点的指针即可完成插入/删除操作…

STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI

SPI相关基础知识 SPI基本概念请自行百度&#xff0c;参考&#xff1a;百度百科SPI简介.我们讲重点和要注意的地方。 master模式下要关注的地方 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连&#xff0c;不交叉&#xff0…

Linux 命令大全(下)

Linux 命令大全&#xff08;上&#xff09; 本文目录 6. 网络通讯 常用命令6.1 ssh 命令 – 安全的远程连接服务器6.1.1 含义6.1.2 语法格式6.1.3 常用参数6.1.4 参考示例 6.2 netstat 命令 – 显示网络状态6.2.1 含义6.2.2 语法格式6.2.3 常用参数6.2.4 参考示例 6.3 dhclient…

爬虫逆向实战(32)-某号店登录(RSA、补环境、混淆)

一、数据接口分析 主页地址&#xff1a;某号店 1、抓包 通过抓包可以发现登录接口是/publicPassport/login.do 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有三个加密参数&#xff1a;username、password、captchaTok…

swift 问答app

结构体 mvc模式 不变性 试一试

航天航空及国防制造领军企业「同步电子」携手企企通,推进电子制造供应链管理数字化升级

从地球表面到广阔的星空&#xff0c;从近地轨道到深远的太空&#xff0c;中国的航天事业正在以前所未有的速度向前发展。每一次成功的发射&#xff0c;每一次精确的降落&#xff0c;都展现了国人无比的毅力和精湛的技术。而在北斗导航、长征火箭、嫦娥月球探测器等多个航天设备…

vscode 代码高亮显示

很多情况下vscode显示代码无法完全高亮显示&#xff0c;就很不舒服 除了语言设置为pylance之外&#xff0c;vscode本身的主题也是很重要的一个因素 改现代神色即可