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

news2024/11/26 19:59:15

 

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.coloradmin.cn/o/1019986.html

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

相关文章

基于反向推理的序列预测模型

序列预测是机器学习中的一个关键问题,涉及到频繁序列挖掘、时间序列预测、自然语言处理等多个领域。在预测模型中,一个关键的挑战就是如何有效地利用历史信息进行预测。目前,大多数预测模型都是基于历史信息进行前向推理,这种方法在输入序列不完全或未知的情况下,其预测效…

性能测试-性能工程全景图、实施方案、建设目标(20)

性能工程是一个关注系统性能层面的体系,包含测试环境的性能测试、生产环境的性能测试、性能调优、容量规划等多个方面 性能工程主要包括如下3个部分 ❑建设性能测试理论体系和流程规范、链路分析基础知识体系和流程规范、性能调优基础理论体系和流程规范。 ❑搭建高效协同的工…

Typora远程代码执行漏洞CVE-2023-2317

0x00 前言 漏洞详情 版本16.7以前的Typora中的updater/update.html存在基于DOM的XSS&#xff0c;可以通过加载定制的markdown文件实现任意javascript代码执行。 原理分析 漏洞触发点位于Typora的updater.html文件&#xff0c;通过特定协议typora://即可访问&#xff0c;同时…

PDF怎样加密?希望这些方法可以帮助大家

PDF怎样加密&#xff1f;我们平时会使用到非常多的pdf文件&#xff0c;相信大家也接触过这样一种pdf文件&#xff0c;当我们想要打开这个pdf文件的时候被告知需要输入一个密码后才能真正打开&#xff0c;都则这个文件你是无法打开的&#xff0c;这是因为这个pdf文件已经进行了加…

自动化和数字化在 ERP 系统中意味着什么?

毋庸置疑&#xff0c;ERP系统的作用是让工作更轻松。它可以集成流程&#xff0c;提供关键分析&#xff0c;确保你的企业高效运营。这些信息可以提高你的运营效率&#xff0c;并将有限的人力资本重新部署到更有效、更重要的需求上。事实上&#xff0c;自动化和数字化是ERP系统最…

思维导图怎么画好看又简单?看看这个方法

思维导图怎么画好看又简单&#xff1f;思维导图是一种非常有用的工具&#xff0c;可以帮助我们组织和展示思维。如果你想要画出既好看又简单的思维导图&#xff0c;那么我们可以使用一些思维导图制作工具。下面就给大家介绍一款个人觉得很好用的思维导图制作工具。 【迅捷画图】…

【八大经典排序算法】堆排序

【八大经典排序算法】堆排序 一、概述二、思路解读三、代码实现&#xff08;大堆为例&#xff09; 一、概述 堆排序是J.W.J. Williams于1964年提出的。他提出了一种利用堆的数据结构进行排序的算法&#xff0c;并将其称为堆排序。堆排序是基于选择排序的一种改进&#xff0c;通…

嵌入式应用范围为什么这么广?

嵌入式应用范围为什么这么广&#xff1f; 嵌入式技术的应用范围远比我们想象的要广泛。从传统的角度看&#xff0c;空调、电饭煲、电风扇、冰箱、遥控器、路由器、洗衣机、智能手机、投影仪、音响等等&#xff0c;几乎每天都在使用的产品都离不开嵌入式技术。 而随着互联网的…

【力扣周赛】第 363 场周赛(完全平方数和质因数分解)

文章目录 竞赛链接Q1&#xff1a;100031. 计算 K 置位下标对应元素的和竞赛时代码写法2——手写二进制中1的数量 Q2&#xff1a;100040. 让所有学生保持开心的分组方法数&#xff08;排序后枚举分界&#xff09;竞赛时代码 Q3&#xff1a;100033. 最大合金数&#xff08;二分答…

400电话客服中心电话:为您提供全方位的客户服务

在现代商业环境中&#xff0c;提供优质的客户服务是企业成功的关键之一。为了满足客户的需求和解决问题&#xff0c;许多企业选择设立400电话客服中心。400电话是一种特殊的电话号码&#xff0c;可以通过固定电话和移动电话拨打&#xff0c;客户可以通过这个号码与企业进行沟通…

数据库问题记录(粗略版)oracle、mysql等主流数据库通用

1. ORA-00918&#xff1a;未明确定义列 该问题情况大致为&#xff1a;select 所取列名错误、重复等问题。 2. “select * from temp where 10; ”的含义 布尔值为FALSE&#xff0c;只返回表结构&#xff0c;不返回数据。 举一反三&#xff1a; select * from temp where 1&…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目&#xff0c;主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势&#xff1a; 支持多个版本的 Python提供验证码本地识别功能可…

JVM执行流程

一、Java为什么是一种跨平台的语言&#xff1f; 通常&#xff0c;我们编写的java源代码会被JDK的编译器编译成字节码文件&#xff0c;再由JVM将字节码文件翻译成计算机读的懂得机器码进行执行&#xff1b;因为不同平台使用的JVM不一样&#xff0c;所以不同的JVM会把相同的字节码…

TypeScript逆变 :条件、推断和泛型的应用

TypeScript逆变 &#xff1a;条件、推断和泛型的应用 1 一个类型问题 有一个名为 test 的函数&#xff0c;它接受两个参数。第一个参数是函数 fn&#xff0c;第二个参数 options 受到 fn 参数的限制。乍一看&#xff0c;这个问题貌似并不复杂&#xff0c;不是吗&#xff1f;糊…

华为OD机试 - 流水线 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

企业部署了MES管理系统为什么还要APS

在制造企业中&#xff0c;MES制造执行系统和高级计划与排程系统&#xff08;APS&#xff09;是两大核心的制造运营管理软件。尽管MES管理系统在工厂层面对生产活动进行实时监控和优化&#xff0c;但APS在更高的战略层面对生产和供应链进行规划和管理。因此&#xff0c;即使企业…

软件系统的验收方法

软件系统的验收是确保软件按照规格要求并满足用户需求的过程。验收过程通常涉及与项目利益相关者&#xff08;包括客户、用户和项目团队&#xff09;一起进行各种测试和评估。以下是一些常见的软件系统验收方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#…

操作系统备考学习 day4 (2.1.7 - 2.2.4)

操作系统备考学习 day4 二、进程与线程2.1 进程与线程2.1.7 线程的状态与转换 2.2 处理机调度2.2.1 调度的概念、层次2.2.2 进程调度的时机切换与过程调度的方式2.2.3 调度器、闲逛进程2.2.4 调度算法的评价指标 二、进程与线程 2.1 进程与线程 2.1.7 线程的状态与转换 线程…

STM32 CAN使用记录:FDCAN基础通讯

文章目录 目的基础说明关键配置与代码轮询方式中断方式收发测试 示例链接总结 目的 CAN是非常常用的一种数据总线&#xff0c;被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。 CAN的一些基础介绍与使用可以参考下面文章&#xff1a; 《CAN基础概念》htt…

芯科蓝牙BG27开发笔记9-蓝牙温控器例程阅读

源码&#xff1a; https://download.csdn.net/download/hxkrrzq/88353283 以上源码都是官方资源&#xff0c;可以自行gitbub下载&#xff08;参见之前笔记&#xff09; 蓝牙广播格式化 之前的笔记中广播数据是直接使用的十六进制字符串&#xff0c;关于这32bytes数据的格式化…