($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('H:i');
$s = "";
return $s;
}
// form_date('start', '2018-07-05') 为空则当前日期
function form_date($name, $value = 0, $width = FALSE)
{
$style = '';
if (FALSE !== $width) {
is_numeric($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('Y-m-d');
$s = "";
return $s;
}
/**用法
*
* echo form_radio_yes_no('radio1', 0);
* echo form_checkbox('aaa', array('无', '有'), 0);
*
* echo form_radio_yes_no('aaa', 0);
* echo form_radio('aaa', array('无', '有'), 0);
* echo form_radio('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'b');
*
* echo form_select('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'a');
*/
?>组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?>return $r;
}
/**
* @param int $page 页数
* @param int $pagesize 每页显示数量
* @return mixed
*/
function link_find($page = 1, $pagesize = 100)
{
$arr = link__find($cond = array(), array('rank' => -1), $page, $pagesize);
return $arr;
}
/**
* @param $id
* @return bool 返回FALSE失败 TRUE成功
*/
function link_delete($id)
{
if (empty($id)) return FALSE;
$r = link__delete(array('id' => $id));
link_delete_cache();
return $r;
}
//--------------------------kv + cache--------------------------
/**
* @return mixed 返回全部友情链接
*/
function link_get($page = 1, $pagesize = 100)
{
$g_link = website_get('friends_link');
if (empty($g_link)) {
$g_link = link_find($page, $pagesize);
$g_link AND website_set('friends_link', $g_link);
}
return $g_link;
}
// delete kv and cache
function link_delete_cache()
{
website_set('friends_link', '');
return TRUE;
}
?> $v = implode(",", $v);
$temp[] = $v;
}
// 去掉重复的字符串,也就是重复的一维数组
$temp = array_unique($temp);
// 再将拆开的数组重新组装
$output = array();
foreach ($temp as $k => $v) {
if ($stkeep) $k = $starr[$k];
if ($ndformat) {
$temparr = explode(",", $v);
foreach ($temparr as $ndkey => $ndval) $output[$k][$ndarr[$ndkey]] = $ndval;
} else $output[$k] = explode(",", $v);
}
return $output;
}
// 合并二维数组 如重复 值以第一个数组值为准
function array2_merge($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array1 as $k => $v) {
isset($v[$key]) ? $arr[$v[$key]] = array_merge($v, $array2[$k]) : $arr[] = array_merge($v, $array2[$k]);
}
return $arr;
}
/*
* 对二维数组排序 两个数组必须有一个相同的键值
* $array1 需要排序数组
* $array2 按照该数组key排序
* */
function array2_sort_key($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array2 as $k => $v) {
if (isset($v[$key]) && $v[$key] == $array1[$v[$key]][$key]) {
$arr[$v[$key]] = $array1[$v[$key]];
} else {
$arr[] = $v;
}
}
return $arr;
}
?>
【数据结构-软件玩家 - 软件改变生活!
【数据结构
散列函数的设计
- 散列查找的基本思想
- 散列函数的设计原则
- 三种常见的散列函数
-
- 处理冲突的方法
-
散列查找的基本思想
在记录的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key和唯一的存储位置H(key)相对应。
存储记录时,根据这个对应关系找到关键码的映射地址,并按此地址存储该记录;查找记录时,根据这个对应关系找到待查找关键码的映射地址,并按此地址访问该记录。
采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表(hash table),将关键码映射为散列表中适当存储位置的函数称为散列函数(hash function),所得到的存储位置成为散列地址(hash address)。
散列函数的设计原则
- 计算简单。散列函数不应该有很大的计算量,否则会降低查找效率。
- 函数值(即散列地址)分布均匀,希望散列函数能够把记录以相同的概率“散列”到散列表的所有地址空间中,这样才能保证存储空间的有效利用,并减少冲突。
三种常见的散列函数
1. 直接定址法
直接定址法的散列函数是关键码的线性函数,即:
H(key) = a × key + b(a,b为常数)
例如,关键码集合为{10,30,50,70,80,90},选取H(key) = key/10。则散列表如下图所示。
直接定址法的特点是不会产生冲突,但实际应用中能使用这种散列函数的情况很少。它适用于事先知道关键码的分布,关键码集合不是很大且连续性较好的情况。
2. 除留余数法
除留余数法的基本思想是:选择某个适当的正整数p,以关键码除以p的余数作为散列地址,即:
H(key) = key mod p
可见这个方法的关键在于选取合适的p,否则容易产生同义词。例如,若p含有质因子,例如p = m × n,则所有含有m或n因子的关键码的散列地址均为m或n的倍数,如下图所示
显然,这增加了冲突的机会。一般情况下,若散列表表长为m,通常选p小于或等于表长(最好接近m)的最小素数或不包含小于20质因子的合数。
3. 平方取中法
平方取中法是对关键码平方后,按散列表大小,取中间若干位作为散列地址(简称平方后截取),其原理是一个数平方后,中间的几位分布较均匀,从而冲突发生的概率较小。
例如,对于关键码1234,假设散列地址是2位,由于1234×1234=1522756,选取中间的两位作为散列地址,可以选22也可以选27.
平方取中法通常用在事先不知道关键码的分布且关键码的位数不是很大的情况。
处理冲突的方法
通常情况下,由于关键码的复杂性和随机性,很难找到理想的散列函数。如果某记录按散列函数计算出的散列地址加入散列表时产生了冲突,就必须再找一个地方来存放它,因此,需要有合适的处理冲突方法。下面列出两种常用的处理冲突的方法。
1. 开放定址法
开放定址法处理冲突的方法是,如果由关键码得到的散列地址产生了冲突,根据(H(key) + d)% m 寻找下一个空的散列地址。
例:设关键码集合{47,7,29,11,16,92,22,8,3},散列表表长为11,散列函数为H(key) = key mod 11,用开放定址法处理冲突,得到的散列表如图所示,具体过程如下:
H(47)=3,H(7)=7,没有冲突,直接存入;
H(29)=7,发生冲突,(H(29)+1)%11=8,散列地址8为空,将29存入;
H(11)=0,H(16)=5,H(92)=4,没有冲突,直接存入;
H(22)=0,发生冲突,(H(22)+1)%11=1,散列地址1为空,将22存入;
H(8)=8,发生冲突,(H(8)+1)%11=9,散列地址9为空,将8存入;
H(3)=3,发生冲突,(H(3)+1)%11=4,仍然冲突,(H(3)+2)%11=5,仍然冲突,(H(3)+3)%11=6,散列地址6为空,将3存入
算法定义:
int HashTableSearch(int *ht, int k){int i, j = H(k); //计算散列地址i = j; //设置比较的起始位置while(ht[i] != 0){if(ht[i] == k) return i; //查找成功else i = (i + 1) % MaxSize; //向后探测一个位置}return -1; //查找失败
}
2. 拉链法(链地址法)
基本思想: 将所有散列地址相同的记录,及所有关键码为同义词的记录存储在一个单链表中——称为同义词子表(synonym table),在散列表中存储的是所有同义词子表的头指针。
开散列表的类定义和查找方法
template <typename DataType>
class Node{
public:Node<DataType> *next;DataType data;
};const int MaxSize = 100;
class HashTable{
public:HashTable(); //构造函数,初始化开散列表~HashTable(); //析构函数,释放同义词子表结点int Insert(int k);int Delete(int k);Node<int> *Search(int k);
private:int H(int k);Node<int> *ht[MaxSize];
};HashTable::HashTable(){for (int i = 0; i < MaxSize; ++i)ht[i] = nullptr;
}HashTable::~HashTable(){Node<int> *p = nullptr, *q = nullptr;for (int i = 0; i < MaxSize; ++i){p = q = ht[i];while(p != nullptr){p = p->next;delete q;q = p;}}
}Node<int>* HashTable::Search(int k){int j = H(k); //计算散列地址Node<int> *p = ht[j]; //工作指针p初始化while(p != nullptr){if(p->data == k) return p;else p = p->next;}return nullptr; //查找失败
}
本文标签:
数据结构
更多相关文章
【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了
由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围绕着 数据结构算法计算机网络操作系统Linux数据库 这几个方面发的,为了
有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库.....
大家好,我是小林哥。 平日里,大家都喊程序员加班多很辛苦,动不动就掉头发,但干的还是很香的,毕竟大多数公司钱还是给的很到位的&a
数据结构课程设计之学生宿舍信息管理系统
一、问题陈述 宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据
C语言大作业 数据结构 医院候诊排队系统 代码【可运行代码+截图】
设计内容: 设计一个医院候诊排队系统。问题描述:医院各科室的医生有限,因此病人到医院看病时必须排队候诊,而病人的病情有轻重之分,
数据结构:Win32 API详解
目录 一.Win32 API的介绍 二.控制台程序(Console)与COORD 1..控制台程序(Console): 2.控制台窗口坐标COORD: 3.GetStdHandle函数:
探索数据结构之美——有序集合的内部机制
写在文章开头 在现代软件开发中,高效的数据结构和算法设计对于构建高性能系统至关重要。有序集合(Sorted Set)作为一种常用的数据结构,在许多应用场景中发挥着重要作用,例如缓存、索引、排名等。本文将深入探讨有序集合的内部机制,分析其源
CLRS算法之旅:高效提升编程技能的实战手册
CLRS算法实现指南:如何高效掌握经典数据结构与算法 想要深入理解《算法导论》这本经典教材吗?CLRS项目为你提供了完整的算法实现解决方案,帮助你从理论到实践全面掌握数据结构与算法知识。这个开源项目包含了从基础排序到高级图算法
轻松攻克CLRS难题:高效掌握算法与数据结构的实用技巧
CLRS算法实现指南:如何高效掌握经典数据结构与算法 想要深入理解《算法导论》这本经典教材吗?CLRS项目为你提供了完整的算法实现解决方案,帮助你从理论到实践全面掌握数据结构与算法知识。这个开源项目包含了从基础排序到高级图算法
发表评论