算法-常见数据结构设计

文章目录

    • 1. 带有setAll功能的哈希表
    • 2. LRU缓存结构
    • 3. O(1)时间插入删除随机(去重)
    • 4. O(1)时间插入删除随机(不去重)
    • 5. 快速获取数据流中的中位数
    • 6. 最大频率栈
    • 7. 全O(1)结构
    • 8. LFU缓存结构

本节的内容比较难, 大多是leetcodeHard难度级别的题目

1. 带有setAll功能的哈希表

哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。

在这里插入图片描述

思路分析 :
原始的哈希表的put,get,containsKey方法的时间复杂度都是O(1), 现在我们需要添加一个setAll方法, 把表中所有元素的值都改为一个特定的value,显然直接遍历的时间复杂度肯定不是O(1)
为了做到时间复杂度是O(1)我们采用时间戳计数的方法
给定一个属性time记录下本次操作的时间节点, 然后给定一个属性是setAllValue和setAllTime,记录下来我们的setAll调用时候是时间节点和设置的变量, 然后get方法返回的时候如果是大于该节点我们就进行返回原有的值, 如果小于该节点, 我们就返回setAllValue的值
代码实现如下…


/*** 下面这个高频的数据结构是带有setAll功能的HashMap实现* 原理就是传入一个时间戳, 然后进行模拟的判断*/
class HashMapConSetAll {//基础的HashMap结构private HashMap<Integer, int[]> map = new HashMap<>();//定义一个时间戳private int time = 0;//定义一个是用setAll方法的时间节点以及相关的值private int setAllValue = 0;private int setAllTime = -1;//给一个无参的构造方法public HashMapConSetAll() {}//我们实现的特殊HashMap的put方法public void put(int key, int value) {if (!map.containsKey(key)) {map.put(key, new int[]{value, time++});} else {int[] temp = map.get(key);temp[0] = value;temp[1] = time++;}}//我们实现的特殊的HashMap的get方法public int get(int key) {if (!map.containsKey(key)) {return -1;}//代码执行到这里说明我们的map里面没有这个元素int[] temp = map.get(key);if (temp[1] > setAllTime) {return temp[0];} else {return setAllValue;}}//特殊的containsKey方法public boolean containsKey(int key) {return map.containsKey(key);}//最重要的setAll方法public void setAll(int value) {this.setAllTime = time++;this.setAllValue = value;}
}

2. LRU缓存结构

在这里插入图片描述

该数据结构的实现借助的是哈希表加上双向链表的方式, 我们定义一个节点类Node, 里面的基础属性就是key与val, 我们的哈希表中的key就是节点中的key,我们的val就是该节点的地址, 为什么要用节点的地址作为val其实也非常的好理解, 用Node作为地址我们可以直接找到这个节点的位置然后进行操作,下面是我们的代码实现


/*** LRU缓存结构* 实现的方法就是双向链表 + 哈希表, 可以直接通过哈希表在O(1)的时间复杂度下获取到位置节点的地址* 手写一个双向链表就行了*/
class LRUCache {// 首先定义的是双向链表的节点类public static class Node {int key;int val;Node prev;Node next;public Node(int key, int val) {this.key = key;this.val = val;}}// 双向链表的实现方式public static class DoubleLinkedList {// 链表的头部(代表的是最早操作的数据)public Node first;// 链表的尾部(代表的是最新操作的数据)public Node last;// 给一个无参数的构造方法public DoubleLinkedList() {first = null;last = null;}// 添加节点的方法public void addNode(Node node) {if (node == null) {return;}if (first == null && last == null) {first = node;last = node;return;}last.next = node;node.prev = last;last = node;}//重构一下remove()和removeToLast()方法public Node remove() {//没节点你删除个damn啊if (first == null && last == null) {return null;}//只有一个节点的情况Node node = first;if (first == last) {last = null;first = null;} else {Node next = first.next;first.next = null;first = next;next.prev = null;}return node;}//下面是重构的removeToLast方法public void removeToLast(Node node) {//首先排除掉特殊的情况if (node == null || first == null) {return;}//如果只有一个的话或者是尾巴节点if (first == last || node == last) {return;}//如果是头节点的节点 / 普通的节点if (node == first) {Node next = node.next;node.next = null;first = next;first.prev = null;} else {node.prev.next = node.next;node.next.prev = node.prev;node.prev = null;node.next = null;}//此时node节点完全是一个独立的节点last.next = node;node.prev = last;last = node;}}private HashMap<Integer, Node> map = new HashMap<>();DoubleLinkedList list = new DoubleLinkedList();private int capacity;public LRUCache(int capacity) {this.capacity = capacity;}public int get(int key) {if (!map.containsKey(key)) {return -1;}Node node = map.get(key);list.removeToLast(node);return node.val;}public void put(int key, int value) {if (map.containsKey(key)) {Node node = map.get(key);node.val = value;list.removeToLast(node);} else {Node node = new Node(key, value);if (map.size() < capacity) {map.put(key, node);list.addNode(node);} else {Node nde = list.remove();map.remove(nde.key);list.addNode(node);map.put(key, node);}}}public static void main(String[] args) {LRUCache lruCache = new LRUCache(2);lruCache.put(1, 0);lruCache.put(2, 2);int res = lruCache.get(1);lruCache.put(3, 3);int res1 = lruCache.get(2);lruCache.put(4, 4);int res2 = lruCache.get(1);int res3 = lruCache.get(3);int res4 = lruCache.get(4);}
}

3. O(1)时间插入删除随机(去重)

在这里插入图片描述

这个类的实现还是基于的哈希表, 外加上一个动态数组, key就是该数字, val是在动态数组里面的下标的位置, 如果删除元素, 动态数组中的那个空位置我们就用最后一个元素去填充, 然后删掉最后一个游戏(这样就保证了这个时间的复杂度O(1)), 同时在哈希表里面删除该值, 并该变最后一个元素的val为删除元素的之前的下标, 代码实现如下

class RandomizedSet {//其实现的方式是通过动态数组也就是我们的ArrayList跟HashMap共同实现的//其实从我们的经验可以了解到, 凡是涉及到O(1)的操作一般都是通过散列表的形式实现的HashMap<Integer, Integer> map = new HashMap<>();ArrayList<Integer> list = new ArrayList<>();//构造方法这里其实没什么用, 我们直接设置为空方法体的public RandomizedSet() {}//常规的insert方法, 我们的map结构第一个整数存储的就是值, 第二个是下标public boolean insert(int val) {if (!map.containsKey(val)) {list.add(val);map.put(val, list.size() - 1);return true;}return false;}//remove方法是一个比较重要的方法public boolean remove(int val) {if (map.containsKey(val)) {int valIndex = map.get(val);int endValue = list.get(list.size() - 1);map.put(endValue, valIndex);list.set(valIndex, endValue);map.remove(val);list.remove(list.size() - 1);return true;}return false;}public int getRandom() {int randIndex = (int) (Math.random() * list.size());return list.get(randIndex);}public static void main1(String[] args) {RandomizedSet randomizedSet = new RandomizedSet();randomizedSet.remove(0);randomizedSet.remove(0);randomizedSet.insert(0);int res = randomizedSet.getRandom();randomizedSet.remove(0);randomizedSet.insert(0);}
}

4. O(1)时间插入删除随机(不去重)

在这里插入图片描述

这个题目跟上一个题目只有一个不一样的地方就是这个哈希表的val是我们的HashSet,也就是一个下标集合, 我们进行元素删除的时候我们就随意选择一个待删除元素的下标进行删除即可, 我们的getRandom方法是用动态顺序表的数据进行返回的, 所以自带加权的功能, 代码实现如下

class RandomizedCollection {// 这个其实原来的HashMap中的value不再是整数, 而是一个HashSet集合ArrayList<Integer> arr = new ArrayList<>();HashMap<Integer, HashSet<Integer>> map = new HashMap<>();public RandomizedCollection() {}//insert方法是比较简单的, 就是直接放入元素即可public boolean insert(int val) {HashSet<Integer> set = map.get(val);if(set == null){HashSet<Integer> tempSet = new HashSet<>();tempSet.add(arr.size());map.put(val,tempSet);arr.add(val);return true;}else{set.add(arr.size());arr.add(val);return false;}}public boolean remove(int val) {HashSet<Integer> set = map.get(val);if(set == null){return false;}int indexValue = set.iterator().next();int swapValue = arr.get(arr.size() - 1);int swapIndex = arr.size() - 1;if(swapValue == val){arr.remove(arr.size() - 1);set.remove(arr.size());}else{HashSet<Integer> end = map.get(swapValue);end.remove(swapIndex);end.add(indexValue);set.remove(indexValue);arr.set(indexValue,swapValue);arr.remove(swapIndex);}if(set.size() == 0){map.remove(val);}return true;}public int getRandom() {return arr.get((int) (Math.random() * arr.size()));}
}/*** Your RandomizedCollection object will be instantiated and called as such:* RandomizedCollection obj = new RandomizedCollection();* boolean param_1 = obj.insert(val);* boolean param_2 = obj.remove(val);* int param_3 = obj.getRandom();*/

5. 快速获取数据流中的中位数

在这里插入图片描述

该数据结构的实现就是通过我们的堆结构来实现的, 建立一个大根堆来装入小半部分的数据, 建立一个小根堆来建立大半部分的数据, 记住在装入数据的过程中我们要保持我们的堆中的元素的大小, 也就是通过一个balance方法, 来保持两边的数量差值不超过1, 获取中位数的时候我们, 如果两边数量不一致, 就返回多的哪一方的堆顶, 如果一致, 我们就返回两个堆顶的平均值, 代码实现如下

class MedianFinder {private PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});// 默认就是小根堆private PriorityQueue<Integer> minHeap = new PriorityQueue<>();public MedianFinder() {}public void addNum(int num) {if (maxHeap.isEmpty() || num < maxHeap.peek()) {maxHeap.offer(num);} else {minHeap.offer(num);}balance();}public double findMedian() {if (minHeap.size() == maxHeap.size()) {return (minHeap.peek() + maxHeap.peek()) / 2.0;} else if (maxHeap.size() < minHeap.size()) {return minHeap.peek();} else {return maxHeap.peek();}}// 平衡堆结构的方法private void balance() {if (Math.abs(minHeap.size() - maxHeap.size()) == 2) {if (minHeap.size() - maxHeap.size() == 2) {maxHeap.offer(minHeap.poll());} else {minHeap.offer(maxHeap.poll());}}}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();

6. 最大频率栈

在这里插入图片描述

这道题目的思路就是用两个哈希表, 第一个哈希表存储的是词频统计, 第二个哈希表是一个类似桶的结构, key就是出现的词频, val是一个动态的顺序表, 代码实现如下

class FreqStack {//本质就是通过哈希来模拟//哈希表的key是词频统计, val是一个动态的顺序表, 里面存放这该词频的数字HashMap<Integer,ArrayList<Integer>> map = new HashMap<>();//再创建一个哈希表用于词频的统计HashMap<Integer,Integer> frq = new HashMap<>();//最大的词频(用于pop()操作指示)private int maxFrq = 0;public FreqStack() {//构造方法里面不写东西}public void push(int val){//首先进行词频的统计frq.put(val,frq.getOrDefault(val,0) + 1);maxFrq = Math.max(maxFrq,frq.get(val));ArrayList res = map.get(frq.get(val));if(res == null){ArrayList<Integer> arr = new ArrayList<>();arr.add(val);map.put(frq.get(val),arr);}else{res.add(val);}}//pop方法的时候应该进行的元素的删除操作public int pop() {ArrayList<Integer> arr = map.get(maxFrq);if(arr.size() == 1){int temp = arr.remove(0);map.remove(maxFrq--);if(frq.get(temp) == 1){frq.remove(temp);}else{frq.put(temp,frq.get(temp) - 1);}return temp;}else{int temp = arr.remove(arr.size() - 1);if(frq.get(temp) == 1){frq.remove(temp);}else{frq.put(temp,frq.get(temp) - 1);}return temp;}}
}/*** Your FreqStack object will be instantiated and called as such:* FreqStack obj = new FreqStack();* obj.push(val);* int param_2 = obj.pop();*/

7. 全O(1)结构

在这里插入图片描述

这个就是哈希表加上双向链表桶的思路, 哈希表中保存的是该字符串的所在桶的地址, 桶里面存放的是该词频的字符串的情况, 代码实现如下, 下面有一个LFU缓存也是这样的一个结构, 双向链表(桶), 桶里面再嵌套一个双向链表实现的堆结构…

class RandomizedCollection {//这个其实原来的HashMap中的value不再是整数, 而是一个HashSet集合ArrayList<Integer> arr = new ArrayList<>();HashMap<Integer, HashSet<Integer>> map = new HashMap<>();public RandomizedCollection() {}//insert方法是比较简单的, 就是直接放入元素即可public boolean insert(int val) {HashSet<Integer> set = map.get(val);if (set == null) {HashSet<Integer> tempSet = new HashSet<>();tempSet.add(arr.size());map.put(val, tempSet);arr.add(val);return true;} else {set.add(arr.size());arr.add(val);return false;}}public boolean remove(int val) {HashSet<Integer> set = map.get(val);if (set == null) {return false;}int indexValue = set.iterator().next();int swapValue = arr.get(arr.size() - 1);int swapIndex = arr.size() - 1;if (swapValue == val) {arr.remove(arr.size() - 1);set.remove(arr.size());} else {HashSet<Integer> end = map.get(swapValue);end.remove(swapIndex);end.add(indexValue);set.remove(indexValue);arr.set(indexValue, swapValue);arr.remove(swapIndex);}if (set.size() == 0) {map.remove(val);}return true;}public int getRandom() {return arr.get((int) (Math.random() * arr.size()));}public static void main(String[] args) {RandomizedCollection set = new RandomizedCollection();set.insert(1);set.remove(1);set.insert(1);}
}

8. LFU缓存结构


/*** LFU缓存 :* 1. 首先定义一个节点的对象, 里面保存的是该传入数据的key和value(ListNode)* 这个东西也是一个双向链表的结构(模拟队列使用) --> 不可以用LinkedList(源码的remove方法是遍历删除的结构)* 2. 其次我们定义一个桶结构, 里面有一个val用来保存操作的次数, 还有一个双向的链表(也就是我们的上面定义的队列结构)* 这个桶的结构也是类似于双端的链表(模拟双向链表使用)* 3. 然后我们需要定义两个哈希表* 第一个HashMap中的val保存的是该数字的所在桶的地址(方便定位桶的位置进行操作)* 第二个HashMap中的val保存的是该数字本身的ListNode的地址(方便进行删除操作)* 4. 返回使用量最小的元素就去最左边的桶里面拿队列中的first元素* 5. 桶的左右两侧我们定义了0操作次数, 以及Integer.MAX_VALUE桶, 减少了边界位置的判断*/class LFUCache {/*** 基础的节点的元素定义*/static class Node {int key;int val;Node prev;Node next;public Node(int key, int val) {this.key = key;this.val = val;}}/*** 模拟的队列的实现类*/static class MQueue {//属性定义为这样是为了和下面的桶结构区分开Node head;Node tail;int size;//无参数的构造方法public MQueue() {this.head = null;this.tail = null;}//remove方法用来移除掉指定位置的节点public Node remove(Node node) {if (head == null || tail == null) {throw new RuntimeException("没有节点无法移动");}if (head == tail) {tail = null;head = null;} else if (node == this.head) {Node temp = this.head.next;this.head.next = null;this.head = temp;this.head.prev = null;} else if (node == tail) {Node temp = tail.prev;tail.prev = null;tail = temp;tail.next = null;} else {node.prev.next = node.next;node.next.prev = node.prev;node.next = null;node.prev = null;}size--;return node;}//下面是我们的pop方法public Node pop() {return remove(head);}//下面是我们的offer()方法public void offer(Node node) {if (head == null && tail == null) {head = node;tail = node;size++;return;}tail.next = node;node.prev = tail;tail = node;size++;}}/*** 下面我们要完成我们的桶结构的实现(桶结构的val是出现的次数, 桶结构里面有一个我们手写的一个队列结构)*/static class Bucket {//出现的频率int time;//我们想要的队列结构MQueue mQueue;//模拟双向链表必须的实现Bucket prev;Bucket next;//构造方法public Bucket(int time) {this.time = time;mQueue = new MQueue();}}static class MBucket {//用作基石的两个桶Bucket min = new Bucket(0);Bucket max = new Bucket(Integer.MAX_VALUE);public MBucket(){min.next = max;max.prev = min;}//桶的插入插入操作(cur是参照结构)public void insert(Bucket cur, Bucket pos) {cur.next.prev = pos;pos.next = cur.next;cur.next = pos;pos.prev = cur;}//桶的删除操作public void remove(Bucket cur) {cur.prev.next = cur.next;cur.next.prev = cur.prev;}}//那个容量大小int capacity;//两个重要的HashMap结构HashMap<Integer, Node> nodeIndexMap = new HashMap<>();HashMap<Integer, Bucket> bucketIndexMap = new HashMap<>();MBucket mBucket = new MBucket();public LFUCache(int capacity) {this.capacity = capacity;}public int get(int key) {if (!nodeIndexMap.containsKey(key)) {return -1;} else {Bucket curBucket = bucketIndexMap.get(key);Node curNode = nodeIndexMap.get(key);if (curBucket.next.time > curBucket.time + 1) {Bucket newBucket = new Bucket(curBucket.time + 1);mBucket.insert(curBucket, newBucket);curBucket.mQueue.remove(curNode);newBucket.mQueue.offer(curNode);} else {curBucket.mQueue.remove(curNode);curBucket.next.mQueue.offer(curNode);}bucketIndexMap.put(key, curBucket.next);//判断先前的那个桶是不是空的(是空桶就删掉)if (curBucket.mQueue.size == 0) {mBucket.remove(curBucket);}return curNode.val;}}public void put(int key, int value) {if (nodeIndexMap.containsKey(key)) {Node curNode = nodeIndexMap.get(key);Bucket curBucket = bucketIndexMap.get(key);curNode.val = value;if (curBucket.next.time > curBucket.time + 1) {Bucket newBucket = new Bucket(curBucket.time + 1);mBucket.insert(curBucket, newBucket);curBucket.mQueue.remove(curNode);newBucket.mQueue.offer(curNode);} else {curBucket.mQueue.remove(curNode);curBucket.next.mQueue.offer(curNode);}bucketIndexMap.put(key, curBucket.next);//判断先前的那个桶是不是空的(是空桶就删掉)if (curBucket.mQueue.size == 0) {mBucket.remove(curBucket);}} else {Node newNode = new Node(key, value);if (nodeIndexMap.size() < capacity) {if (mBucket.min.next.time != 1) {Bucket newBucket = new Bucket(1);newBucket.mQueue.offer(newNode);mBucket.insert(mBucket.min, newBucket);nodeIndexMap.put(key, newNode);bucketIndexMap.put(key, newBucket);} else {Bucket oneBucket = mBucket.min.next;oneBucket.mQueue.offer(newNode);nodeIndexMap.put(key, newNode);bucketIndexMap.put(key, oneBucket);}} else {Node removeNode = mBucket.min.next.mQueue.pop();nodeIndexMap.remove(removeNode.key);bucketIndexMap.remove(removeNode.key);if(mBucket.min.next.mQueue.size == 0){mBucket.remove(mBucket.min.next);}if(mBucket.min.next.time != 1){Bucket newBucket = new Bucket(1);newBucket.mQueue.offer(newNode);mBucket.insert(mBucket.min, newBucket);nodeIndexMap.put(key, newNode);bucketIndexMap.put(key, newBucket);}else{Bucket oneBucket = mBucket.min.next;oneBucket.mQueue.offer(newNode);nodeIndexMap.put(key, newNode);bucketIndexMap.put(key, oneBucket);}}}}public static void main(String[] args) {LFUCache lfu = new LFUCache(2);lfu.put(1,1);lfu.put(2,2);lfu.get(1);lfu.put(3,3);lfu.get(2);lfu.get(3);lfu.put(4,4);lfu.get(1);lfu.get(3);lfu.get(4);}
}

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

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

相关文章

js计算两个日期直接的间隔天,2018/12/14到2017/11/10有多少天

const startDate new Date(2017-11-10)const endDate new Date(2018-12-14)const diffTime Math.abs(endDate - startDate)const diffDays Math.ceil(diffTime / (1000 * 60 * 60 * 24))console.log(diffDays) // 输出天数差 人工智能学习网站 https://chat.xutongbao.top…

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户&#xff0c;可以通过Google账户登录&#xff0c;或者可以注册一个Codeium账户&#xff08;如果没有弹出让你登录账户的界面&#xff0c;可以等安装结束后在右下角找到登录的地方&#xff09; 右下角显示如下图所示&#…

【ubuntu中关于驱动得问题】—— 如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动总结 前言 NVIDIA显卡驱动是用于支持和优化NVIDIA显卡在计算机系统中运行的关键软件组件。该驱动程序能…

【每日一练】python算数练习题(函数.随机.判断综合运用)

""" 幼儿园加减法练习题 答对点赞表情&#xff0c;答错炸弹表情 表情随机出现 如果全答对有大奖 """ import random df0 #定义答对函数 def dd():global dfdf10bq["&#x1f339;&#x1f339;&#x1f339;","&#x1f389;&…

系统测试-测试方法学习

目录 &#xff08;1&#xff09;等价类 &#xff08;2&#xff09;边界值 &#xff08;3&#xff09;正交&#xff1a;&#xff08;只用于确定排列组合&#xff0c;不确定具体内容&#xff09; (4)判定表法 &#xff08;5&#xff09;流程分析法 &#xff08;6&#xff0…

Django 查询数据

模型参考上一章内容&#xff1a; Django QuerySet对象&#xff0c;filter()方法-CSDN博客 查询数据可以通过以下方法&#xff1a; Book.objects.all() Book.objects.filter() Book.objects.get() 1&#xff0c;添加视图函数 Test/app11/views.py from django.shortcuts im…

昇思25天学习打卡营第12天|MindSpore-基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写(Python语言);了解Linux操作系统的基本使用;掌握atc命令进行模型…

Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务 AOPAOP底层原理比如下面的代码案例手动模拟AOP 动态代理详解JDK动态代理具体实现 AOP AOP底层原理 当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类) 面试题&#xff1a;为什么执行方法的时候&#xff0c;会执行切面里的通知方法&#xf…

华为机试HJ40统计字符

华为机试HJ40统计字符 题目&#xff1a; 想法&#xff1a; 统计上述题目中的四种字符的个数存入字典中&#xff0c;按指定顺序进行输出 input_str input()str_dict {"alpha": 0, "space": 0, "number": 0, "others": 0}for i in …

ZYNQ-LINUX环境C语言利用Curl库实现HTTP通讯

前言 在Zynq-Linux环境中&#xff0c;需要使用C语言来编写APP时&#xff0c;访问HTTP一般可以使用Curl库来实现&#xff0c;但是在Zynq的SDK中&#xff0c;并没有集成该库&#xff0c;在寻找了很多资料后找到了一种使用很方便的额办法。这篇文章主要记录一下移植Curl的过程。 …

【2024_CUMCM】数据预处理、数据分析、数据可视化

目录 2023-c题-问题1 问题分析 偏度 峰度 箱线图 读图 重采样、降采样、升采样 重采样 降采样 升采样 解题代码 2023-c题-问题1 问题分析 问题说白了就是探究品类和销售量这两个数据他们各自内在联系&#xff0c;根据题意&#xff0c;我们先进行数 据预处理&#…

【C语言】 —— 编译和链接

【C语言】 —— 编译和链接 一、编译环境和运行环境二、翻译环境2.1、 预处理2.2、 编译&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析&#xff08;3&#xff09;语义分析 2.3、 汇编2.4、链接 三、运行环境 一、编译环境和运行环境 平时我们说写 C语言…

C语言中32位浮点数的格式

以 GNU C为例&#xff0c;它遵循 IEEE 754-2008标准中制定的浮点表示规范。在该规范中定义了 5种不同大小的基础二进制浮点格式&#xff0c;包括&#xff1a;16位&#xff0c;32位&#xff0c;64位&#xff0c;128位&#xff0c;256位。其中&#xff0c;32位的格式被用作标准 C…

使用AOP思想实现开闭原则下的流水日志输出

主要实现思想&#xff1a; 通过实现Convert接口来抽取公共组件&#xff0c;获取想要的标准模型。 现在有两个订单场景&#xff0c;一个保存订单&#xff0c;一个为更新订单。构造如下的服务类&#xff1a; import org.springframework.stereotype.Service;Service public clas…

SHAP(SHapley Additive exPlanations)基于XGBoost模型的可解释机器学习

模型可解释性 这是一个关于错误解释机器学习模型的危险以及正确解释它的价值的故事。如果您发现诸如梯度提升机或随机森林之类的集成树模型的鲁棒准确性很有吸引力&#xff0c;但也需要解释它们&#xff0c;那么我希望您发现这些信息有用且有帮助。 试想一下&#xff0c;我们…

julia系列17: tsp问题代码整理

1. 常用库和基础函数 这里是优化版的函数&#xff1a; using TSPLIB,LKH,Distances,PyPlot MaxNum 10000 tspreadTSPLIB(:att48) dist [round.(Int,euclidean(tsp.nodes[i,:],tsp.nodes[j,:])) for i in 1:tsp.dimension,j in 1:tsp.dimension]; pos(tsp::TSP,t::Vector{In…

uniapp跨域问题解决

找到menifest文件&#xff0c;在文件的最后添加如下代码&#xff1a; // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

httpd目录显示乱码问题

vim /etc/httpd/conf/httpd.conf 在<Directory “/var/www/html”>下添加&#xff1a; IndexOptions CharsetUTF-8重启httpd: systemctl restart httpd.service还是不好看&#xff0c;调整下显示宽度&#xff0c;还是这个位置&#xff1a; <Directory “/var/www/ht…

区块链论文速读A会-ISSTA 2023(2/2)如何检测DeFi协议中的价格操纵漏洞

Conference&#xff1a;ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2023 第1~5篇区块链文章 请点击此…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…